ASP.NET Kern initialisieren singleton nach der Konfiguration des DI
Also sagen wir mal ich habe eine singleton-Instanz der Klasse, dass ich mich in DI-so:
services.AddSingleton<IFoo, Foo>();
Lassen und sagen, dass die Foo
Klasse hat eine Reihe von anderen Abhängigkeiten (meist repository-Klassen, die es ermöglichen, um Daten zu laden).
Mit meinem derzeitigen Verständnis, die Foo-Instanz wird erst erstellt, wenn es zuerst verwendet (gefragt). Gibt es eine Möglichkeit zu initialisieren dieser anderen Klasse als Konstruktor? Wie direkt nach ConfigureServices()
abgeschlossen? Oder sollte der code für die Initialisierung (laden von Daten aus der db) gemacht werden, die in Foo Konstruktor?
(Es wäre schön, wenn diese Klasse laden kann seine Daten vor der ersten Benutzung zu beschleunigen, erste-Zugang)
new Foo()
und registrieren Sie es in ConfigureServices
Methode.InformationsquelleAutor pbz | 2016-08-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Do it yourself während des Startvorgangs.
Oder "warm it up"
oder alternativ
Aber das fühlt sich einfach nur dreckig und ist mehr ein problem mit Ihrem design, wenn Sie etwas tun, sollten Sie nicht in den Konstruktor. Klasse Instanziierung muss schnell sein und wenn Sie lang laufende Aktionen, brechen Sie gegen eine Reihe von best practices und die Notwendigkeit zur Umgestaltung Ihrer code-Basis, anstatt der Suche nach Möglichkeiten zu hacken um es
Ja. Sie in der Regel nur initialisieren von Klassen, die eine spezielle Behandlung erfordern, wie das starten einer service-bus-Anschluss etc. dass Sie nicht möchten, dass passieren, während der bootup-Zeit. Wir brauchen schon mehr Informationen, aber was genau versuchen Sie. Ich vermute, dass Sie tun, einige lang laufende Betrieb im Konstruktor, das ist ein absolutes no go. Klasse Instanziierung sollte schnell sein und lange Laufenden Betrieb NIE erfolgt im Konstruktor. Natürlich kann man auch beheben, die Klasse in
Configure
einmal, aber das fühlt sich einfach "schmutzig"Ja, relativ lange laufen, da geht es um die Datenbank, um Daten abzurufen (über 50ms für mehrere Abfragen). Da dies ein singleton man könnte argumentieren, dass es egal ist, wo es initialisiert wird. Ich denke, dies ist die beste option, so weit (btw Sie falsch Konfigurieren(). Gerade versucht und es funktioniert hinzufügen "ifoo") vom zu der Liste der Parameter für Configure() so, dass die Art und Weise, die ich nicht zu nennen GetService<>(). Danke.
Ich habe zurückgesetzt Bearbeiten, wie das Bearbeiten verwendet eine Init-Methode auf Klassen, das ist ein typischer code smell, weil es bewirkt, dass die zeitliche Kopplung. Lesen Sie den blog-post von Mark Seemann blog.ploeh.dk/2011/05/24/DesignSmellTemporalCoupling
Was ist, wenn das singleton-service benötigt, um Daten aus einer Datei Lesen oder laden von Daten aus einer Datenbank und fungieren als cache für die Daten? Es scheint nicht Recht zu tun, es während der ersten Anforderung (wenn der service gefragt ist), aber mir scheint das eine alltägliche situation. Außerdem werden diese Operationen sind potentiell gefährlich und können exceptions werfen, die Sie fangen wollen, melden etc. was ist die beste Praxis, dies zu tun, wenn das instanziieren service selbst oder "warming up" fühlt sich schmutzig?
InformationsquelleAutor Tseng