Rozważ moduł odpowiedzialny za parsowanie plików dowolnego typu. Zastanawiam się nad wykorzystaniem wzorca strategii do rozwiązania tego problemu, jak już tu wyjaśniłem . Przed przejściem do tego pytania zapoznaj się z połączonym postem.
Rozważ klasę B, która potrzebuje zawartości pliku product.xml. Ta klasa będzie musiała utworzyć instancję odpowiedniego konkretnego implementatora interfejsu Parsera, aby przeanalizować plik XML. Mogę przekazać instancję odpowiedniego implementatora betonu do fabryki, tak aby klasa B miała „fabrykę”. Jednak klasa B będzie wówczas „zależeć” od fabryki w przypadku tworzenia konkretnej implementacji. Oznacza to, że konstruktor lub metoda ustawiająca w klasie B będzie musiała przejść przez fabrykę.
Dlatego fabryka i klasa B, które muszą parsować plik, będą ściśle ze sobą powiązane. Rozumiem, że mogę się całkowicie mylić co do tego, co wyjaśniłem do tej pory. Chciałbym wiedzieć, czy mogę zastosować wstrzykiwanie zależności w scenariuszu, w którym zależność, którą należy wstrzyknąć, to fabryka i jaki byłby właściwy sposób wdrożenia tego, aby móc skorzystać z takich obszarów, jak wyśmiewanie fabryki w moich testach jednostkowych.
Wydaje mi się, że twoja przesłanka jest tu trochę zagmatwana, mówisz o wstrzykiwaniu fabryki, ale wzorzec fabryczny to wzorzec kreacyjny, którego celem było zrobienie podzbioru tego, co robi struktura wstrzykiwania zależności, gdy szkielety DI nie były rozpowszechnione. przydatne z tego powodu. Jeśli jednak masz środowisko DI, tak naprawdę nie potrzebujesz już fabryki, ponieważ środowisko DI może spełnić cel, który fabryka spełniłaby.
To powiedziawszy, pozwól mi wyjaśnić trochę o wstrzykiwaniu zależności i jak ogólnie byś go użył.
Istnieje wiele sposobów wstrzykiwania zależności, ale najczęstsze to wstrzykiwanie konstruktora, wstrzykiwanie właściwości i bezpośredni DIContainer. Będę mówił o wstrzykiwaniu konstruktora, ponieważ wstrzykiwanie własności jest przez większość czasu niewłaściwym podejściem (właściwe podejście czasami), a dostęp do DIContainer nie jest preferowany, z wyjątkiem sytuacji, gdy absolutnie nie możesz wykonać żadnego z innych podejść.
Wtrysk konstruktora jest miejscem, w którym masz interfejs zależności i DIContainer (lub fabrykę), który zna konkretną implementację tej zależności, i gdziekolwiek potrzebujesz obiektu zależnego od tego interfejsu, w czasie budowy przekazujesz implementację z fabryki do to.
to znaczy
Wiele frameworków DI może znacznie to uprościć do tego, gdzie DIContainer sprawdzi konstruktora UserRepository pod kątem interfejsów, dla których zna konkretne implementacje, i automatycznie przekaże je za Ciebie; technika ta często nazywana jest Inwersją Kontroli, chociaż zarówno DI, jak i IoC są terminami, które często się wymieniają i mają niejasne (jeśli w ogóle) różnice.
Teraz, gdy zastanawiasz się, w jaki sposób nadrzędny kod uzyskuje dostęp do DIContainer, możesz mieć klasę statyczną do uzyskania dostępu lub bardziej odpowiednie jest to, że większość frameworków DI pozwala na nowe utworzenie DIContainer, przy czym tak naprawdę będzie on zachowywał się jak opakowanie do wewnętrznego słownika singletonów dla typów, o których wiadomo, że są konkretne dla danych interfejsów.
Oznacza to, że możesz odświeżyć DIContainer w dowolnym miejscu w kodzie i skutecznie uzyskać ten sam DIContainer, który już skonfigurowałeś, aby znać swoje relacje między interfejsem. Zwykłym sposobem ukrywania DIContainer przed częściami kodu, które nie powinny bezpośrednio z nim oddziaływać, jest po prostu upewnienie się, że tylko niezbędne projekty mają odniesienie do frameworku DI.
źródło
DIContainer
zDbConnectionFactory
i koncepcja nadal stoi na stanowisku, że pobrałbyś konkretną implementację ze swojego DI / Factory / etc i przekazałeś ją konsumentom tego typu w czasie ich budowy.Możesz przekazać fabrykę przez wstrzyknięcie zależności, tak jak przekazujesz cokolwiek innego, nie pozwól, aby rekurencyjność sytuacji myliła cię. Nie wiem, co jeszcze powiedzieć o jego wdrożeniu - już wiesz, jak zrobić wstrzykiwanie zależności.
Używam DI do wstrzykiwania fabryk dość regularnie.
źródło
Wstrzykiwanie fabryk nie jest niczym złym. Jest to standardowy sposób, jeśli podczas budowania obiektu nadrzędnego nie możesz zdecydować, jakiej zależności będziesz potrzebować. Myślę, że przykład najlepiej to wyjaśni. Użyję c #, ponieważ nie znam java.
źródło