In diesem Fall denke ich, es ist kein Problem, da das injizierte Objekt nicht in einem Feld referenziert wird, so dass es Garbage Collected sein kann. habe ich recht?
Castle Windsor warnt vor Captive Dependencies. Das Hauptproblem besteht nicht so sehr darin, dass Instanzen keine Speicherbereinigung sind, sondern eine Klasse eine Instanz wiederverwenden wird, die nicht wiederverwendet werden soll.
Ein einfaches Beispiel ist, wenn Sie eine DbContext
in eine Klasse injizieren, die als Singleton konfiguriert ist. Dies führt jedoch dazu, dass DbContext
am Leben gehalten wird, bis sein Singleton-Verbraucher seinen Geltungsbereich verlässt (was normalerweise der Fall ist, wenn die Anwendung endet). A DbContext
sollte jedoch nicht über mehrere Anfragen wiederverwendet werden. Zum einen, weil es einfach nicht threadsicher ist. Darüber hinaus wird es sehr bald veraltet, wodurch es zwischengespeicherte Daten zurückgibt, anstatt die Datenbank erneut abzufragen.
Aus diesem Grund wir register DbContext typically as Scoped. Dies bedeutet jedoch, dass alle seine Kunden höchstens so lange wie die DbContext
leben sollten, um zu verhindern, dass die Anwendung bricht. Darüber warnt Castle.
In Ihrem Fall jedoch speichern Sie nicht die IReservationService
in einem privaten Feld von SsoSettingsProvider
. Dies wäre immer noch ein Problem, da es vernünftig wäre zu erwarten, dass die Objekte, die IReservationService
zurückgeben, die IReservationService
nicht überdauern (andernfalls würde IReservationService
als Singleton registriert werden). Da aus der Sicht der SsoSettingsProvider
, es gibt keine Möglichkeit zu wissen, ob es sicher ist, LogonSettings
zu speichern, ist es viel besser, überhaupt nicht zu speichern.
Darüber hinaus, wie here ausgedrückt, sollten Injektion Konstruktoren ihre Abhängigkeiten überhaupt nicht verwenden. Dies führt zu einer langsamen und unzuverlässigen Objektzusammensetzung.
Also auch wenn Sie Ihr Design analysiert haben könnte und weiß sicher, dass dies in Ihrem Fall funktioniert, würde ich Ihnen eine der folgenden Dinge vorschlagen tun:
- Shop
IReservationService
als privates Feld in SsoSettingsProvider
und Rufen Sie GetSSOSettings
nur auf, wenn einer der SsoSettingsProvider
Mitglieder aufgerufen wird und verhindern Sie die Speicherung LogonSettings
. Dies zwingt Sie dazu, entweder SsoSettingsProvider
scoped oder IReservationService
singleton zu machen. Ob IReservationService
Singleton sein kann oder nicht, kann man nur herausfinden.
- Bei
SsoSettingsProvider
interessiert sich nur für LogonSettings
und LogonSettings
ist ein konstanter Wert, der sich nicht ändern, nachdem die Anwendung gestartet wird, sollten Sie LogonSettings
direkt in SsoSettingsProvider
‚s Konstruktor injizieren. Dies vereinfacht SsoSettingsProvider
und verschiebt das Laden des LogonSettings
auf den Composition Root.
Bitte lesen Sie [diesen Artikel] (http://blog.ploeh.dk/2014/06/02/captive-dependency/), um das Problem zu verstehen. – Steven
danke für den Artikel. Ich bin mir dieses Verhaltens bewusst, aber es ist nicht das gleiche Szenario. Wenn ich den Artikel auf meine Situation abbilde, sollten wir auf 'IRservationService' in einem Feld von' SsoSettingsProvider' verweisen. In meinem Beispiel wird es einmal verwendet. – RedgoodBreaker
Und [dieser Artikel] (http://blog.ploeh.dk/2011/03/03/InjectionConstructorshouldbesimple/) trifft auch auf Ihre Situation zu. – Steven