Ściśle mówiąc, Wstrzykiwanie Zależności naprawdę przeciwstawia się NIE Wstrzykiwaniu Zależności - i dlatego każda strategia zarządzania zależnością, która nie jest Wstrzykiwaniem Zależności.
[Niechciane] sprzężenie, choć nie do końca ortogonalne, może wystąpić lub zostać złagodzone w obu kierunkach. Oba są powiązane z DependencyClass
:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
DependencyClass
w tym przypadku jest powiązany z konkretnym . Ale oba są połączone DependencyClass
. Prawdziwe zło, jeśli jest tutaj, niekoniecznie musi być sprzężeniem, ale DependencyLookupConstructor
musi się zmienić, jeśli DependencyClass
nagle trzeba wprowadzić własne zależności 1 .
Jednak ten konstruktor / klasa jest nawet bardziej luźno:
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
Jeśli pracujesz w C #, powyższe pozwoli ci ServiceLocator
zwrócić cokolwiek po GetMyDoer()
wywołaniu, o ile ma to, do()
co DependencyLocatingConstructor
ma do()
. Korzyści płynące z sprawdzania poprawności podpisu w czasie kompilacji nie są nawet powiązane z pełnym interfejsem 2 .
Więc wybierz swoją truciznę.
Ale w gruncie rzeczy, jeśli istnieje konkretne „przeciwieństwo” wstrzykiwania zależności, byłoby to coś innego w dziedzinie „strategii zarządzania zależnościami”. Między innymi, jeśli użyłeś któregoś z poniższych w rozmowie, rozpoznałbym to jako NIE wstrzykiwanie zależności:
- Wzorzec lokalizatora usług
- Lokalizator / lokalizacja zależności
- Bezpośrednia konstrukcja obiektu / zależności
- Ukryta zależność
- „Zastrzyk niezależny”
1. Jak na ironię, niektóre problemy rozwiązywane przez DI na wyższych poziomach są niejako wynikiem [nadmiernego] użycia DI na niższych poziomach. Miałem przyjemność pracować na codebases z niepotrzebnej złożoności całego wskutek umieszczenia kilka miejsc, gdzie złożoność że faktycznie pomagały ... Ja wprawdzie dociskany przez złej ekspozycji.
2. Korzystanie z lokalizacji usługi umożliwia także łatwe określenie różnych zależności tego samego typu według ich roli funkcjonalnej z kodu wywołującego , przy jednoczesnym zachowaniu dużej niezależności od sposobu budowania zależności. Załóżmy, że musisz rozwiązać User
lub IUser
do różnych celów: np. Locator.GetAdministrator()
Kontra Locator.GetAuthor()
- lub cokolwiek innego. Mój kod może zapytać o to, czego potrzebuje funkcjonalnie, nawet nie wiedząc, jakie interfejsy obsługuje.