2010-03-29 16 views
6

(To pytanie nie opiera się na konkretnych ram IoC, więc interfejsy i typy w moich próbkach są meta-typy. Wystarczy wymienić je z odpowiednimi rodzajami swojego ulubionego IoC ram w twojej głowie.)Wstrzyknięcie zależności: Jak przekazać pojemnik do wstrzykiwania?

W moim Główne metody, ja zazwyczaj skonfigurować mój pojemnik robi coś takiego:

static void Main() 
{ 
    IInjector in = new Injector(); 
    in.Register<ISomeType>().For<SomeType>(); 
    in.Register<IOtherType().For<OtherType>(); 
    ... 

    // Run actual application 
    App app = in.Resolve<App>(); 
    app.Run(); 
} 

Moje pytanie brzmi, jak masz wtryskiwacza wysłane dookoła? Normalnie właśnie zarejestrowałem wtryskiwacz sam w sobie i wstrzyknąłem go do typów, które same będą robić zastrzyk, ale nie jestem pewien, czy to jest właściwy "wzór".

Odpowiedz

14

Nie należy omijać pojemnika.

Zamiast tego, twoja metoda punktu wejścia/metody głównej prosi kontener o obiekty potrzebne do uruchomienia - takie jak obiekt App/komponent bean. Następnie kontener zwraca pełny wykres obiektów połączony z App, który pozwala na uruchomienie app.Run(), przy zachowaniu wszystkich zależności.

To trochę anty-wzór dla obiektów, które mają być świadome kontenera, lub dla każdego obiektu, który pyta kontener o jego zależności - jeśli to zrobisz, masz , a nie odwrócone sterowanie i co Ty nie jest zastrzykiem uzależnienia - wciąż masz przedmioty, które proszą o to, czego potrzebują, zamiast dostawać to, czego potrzebują.

+1

Dobra, co powiesz na to. Aplikacja jest WinForm i ma przycisk, który tworzy i pokazuje formularz. Po każdym naciśnięciu tego przycisku należy utworzyć i wyświetlić nową instancję tego formularza. Ten formularz ma zależności, więc musi zostać rozwiązany przez formularz aplikacji dla każdej instancji. Co teraz? – Alex

+2

@Alex: W tym przypadku możesz użyć "Dostawców" (specjalistycznych fabryk), o których wspominałem w moim drugim poście. Różnica między wstrzykiwaniem dostawcy a wstrzykiwaniem całego iniektora jest taka, że ​​silnie ogranicza to pośrednie, "tajne" zależności. IOW, nie powoduje degradacji wtryskiwacza do lokalizatora usług. –

+0

@chris_l: Więc "Dostawcy" mogą utrzymywać wtryskiwacz wokół, prawda? W przeciwnym razie właśnie poruszyliśmy problem w innym miejscu. – Alex

2

Najlepiej unikać wstrzykiwania wtryskiwacza. Po prostu utwórz typy, których potrzebujesz, a następnie zacznij wykonywać. Napisałem nieco dłuższy post na ten temat: Accessing the DI container

Powiązane problemy