6

Ogólnie przyjmuje się, że przekazywanie kontenera IoC wokół aplikacji i używanie go jako lokalizatora usług jest złą praktyką.Czy można zastosować tryb życia w zamku Windsor bez przekazywania pojemnika?

Wolę używać kontenera tylko w złożonym katalogu głównym aplikacji i zwykle wykonuję pojedyncze wywołanie funkcji Resolve() - rozwiązywanie obiektu najwyższego poziomu w mojej aplikacji i odpowiadanie na kontener w celu wstrzyknięcia zależności do klas niższych wykres obiektu.

Castle Windsor ostatnio dodał tryb życia, w którym można wywołać container.BeginScope() w bloku "using". Z poziomu tego bloku "używanie", rozwiązanie komponentu, który został zarejestrowany w trybie o określonym zakresie, zwróci za każdym razem tę samą instancję, przez czas trwania bloku "używanie".

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

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

Pytanie: Zważywszy, że BeginScope() to metoda rozszerzenie na pojemniku, nie widzę w jaki sposób scoped styl życia może być używany w aplikacji, chyba że pojemnik jest przekazywana dookoła (co naprawdę don” t chcę zrobić). Czy ktoś ma jakieś przykłady, gdzie/w jaki sposób można wykorzystać styl życia?

Dzięki,

Tom

+3

gdzie i dlaczego i dlaczego planujesz używać trybu życia z określonymi obszarami? –

+0

Cześć Krzysztofie, nie mam żadnych planów, aby jeszcze skorzystać z trybu życia. Chciałem tylko zobaczyć kilka przykładów, jak można właściwie wykorzystać styl życia, na wypadek gdyby chciałem go wykorzystać w przyszłości. Myślę, że używanie go w fabrykach wydaje się logicznym podejściem. –

+1

To wydaje się podobne do tego, czego potrzebuję, nie chcę rozpatrywać instancji o zasięgu, jako zależności w konstruktorach, obiektów o tym samym zakresie: http://stackoverflow.com/questions/25064516/dependency-injection-lifestyle- service-shared-instance-between-2 instance-of –

Odpowiedz

7

Myślę, że stosowanie byłoby typowo wewnątrz fabryki, która ma zazwyczaj trafiają zobaczyć pojemnik. Pomyśl o aplikacji internetowej: w pewnym sensie każde wywołanie kontrolera w aplikacji MVC lub "stronie" uruchamia program częściowo niezależny. To nierozsądne, że ten "program" rozwiązuje własne zależności. Oznacza to, że każde wywołanie kontrolera powinno rozwiązać jego zależności za pomocą kontenera.

W zakresie określonego żądania internetowego lub żądania TCP lub sesji użytkownika można chcieć, aby kontener różnił się z obiektami w inny sposób. To jest sposób, abyś wyczyścił to w jednej z własnych fabryk. Podobnie jak w przypadku wszystkich zastosowań IoC, musisz zadbać, aby nie nadużywać go tak, aby logika biznesowa zakradła się do twojego kodu rejestracyjnego.

+1

Uzgodnione. Po wykonaniu dalszych przemyśleń i czytania, ogólna zgoda wydaje się, że kontener może być używany w ramach zestawu punktów wejścia "złożonego katalogu głównego" (przez instalatorów/instalatory i fabryki), ale nie powinien "przeciekać" do innych zespołów zawierających domena aplikacji. –