6

Es ist allgemein anerkannt, dass die Weitergabe eines IoC-Containers um Ihre Anwendung und deren Verwendung als Service-Locator eine schlechte Praxis ist.Ist es möglich, in Castle Windsor ein bestimmtes Leben zu führen, ohne den Container herumzuführen?

Ich bevorzuge die Verwendung des Containers nur im zusammengesetzten Stamm meiner Anwendung und tendiere dazu, einen einzigen Aufruf von Resolve() zu machen - Auflösung des Toplevel-Objekts in meiner Anwendung und Antwort auf den Container, um Abhängigkeiten in Klassen niedriger zu injizieren das Objektdiagramm.

Castle Windsor hat vor kurzem einen Bereich Lifestyle hinzugefügt, wo Sie container.BeginScope() in einem "using" -Block aufrufen können. Innerhalb dieses "using" -Blocks gibt die Auflösung einer Komponente, die bei einem bestimmten Lebensstil registriert wurde, jedes Mal die gleiche Instanz für die Dauer des "using" -Blocks zurück.

container.Register(Component.For<A>().LifestyleScoped()); 

using (container.BeginScope()) 
{ 
    var a1 = container.Resolve<A>(); 
    var a2 = container.Resolve<A>(); 
    Assert.AreSame(a1, a2); 
} 

Frage: Da BeginScope() ist eine Erweiterungsmethode auf den Behälter, ich sehe nicht, wie ein scoped Lebensstil in einer Anwendung verwendet werden kann, wenn der Behälter herumgereicht wird (was ich wirklich don‘ Ich will es tun). Hat jemand Beispiele dafür, wo/wie der bestimmte Lebensstil angewendet werden kann?

Danke,

Tom

+3

wo wie und warum planen Sie, den zielorientierten Lebensstil zu verwenden? –

+0

Hallo Krzystof, ich habe noch keine Pläne, den Bereich Lebensstil noch zu verwenden. Ich wollte nur ein paar Beispiele sehen, wie der Scoped-Lifestyle richtig genutzt werden könnte, falls ich ihn in Zukunft nutzen möchte. Ich denke, es in einer Fabrik zu verwenden scheint wie ein logischer Ansatz. –

+1

Dies scheint ähnlich zu dem, was ich brauche, ich möchte scoped Instanzen als Abhängigkeiten in Konstruktoren, von Objekten mit im gleichen Umfang auflösen: http://stackoverflow.com/questions/25064516/dependency-injection-lifestyle- service-shared-instance-between-2-instances-von –

Antwort

7

Ich denke, die Verwendung der Regel innerhalb einer Fabrik sein würde, die in der Regel um den Behälter zu sehen bekommen. Stellen Sie sich eine Webanwendung vor: Jeder Aufruf eines Controllers in einer MVC-App oder einer "Seite" führt gewissermaßen ein semi-unabhängiges Programm aus. Es ist nicht unvernünftig, dass dieses "Programm" seine eigenen Abhängigkeiten auflöst. Das heißt, jeder Controlleraufruf sollte seine Abhängigkeiten mithilfe des Containers auflösen.

Im Rahmen einer bestimmten Webanforderung, TCP-Anforderung oder Benutzersitzung möchten Sie möglicherweise, dass der Container Objekte anders auflösen kann. Dies ist eine Möglichkeit für Sie, dies sauber in einer Ihrer eigenen Fabriken zu tun. Wie bei allen Verwendungen von IoC müssen Sie darauf achten, dass Sie sie nicht so missbrauchen, dass die Geschäftslogik in Ihren Registrierungscode eindringt.

+1

Einverstanden. Nach weiterem Nachdenken und Lesen scheint der allgemeine Konsens zu sein, dass der Container innerhalb der Eingangspunkt - Assembly "der zusammengesetzten Wurzel" (durch Installer/Bootstrapper und Fabriken) verwendet werden kann, aber nicht in andere Anwendungsbereich. –