Genau genommen ist die Abhängigkeitsinjektion nur wirklich gegen die NICHT- Abhängigkeitsinjektion und daher gegen jede Abhängigkeitsverwaltungsstrategie, die keine Abhängigkeitsinjektion ist.
[Unerwünschte] Kopplung ist zwar kein genaues orthogonales Problem, kann jedoch in beiden Fällen auftreten oder verringert werden. Diese sind beide gekoppelt an DependencyClass:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructorist DependencyClassin diesem Fall an ein bestimmtes gekoppelt . Aber sie sind beide verbunden mit DependencyClass. Das wahre Übel, wenn es eines hier gibt, ist nicht unbedingt die Kopplung, es DependencyLookupConstructormuss sich ändern, wenn DependencyClassplötzlich seine eigenen Abhängigkeiten injiziert werden müssen 1 .
Jedoch wird dieser Konstruktor / Klasse noch mehr lose gekoppelten:
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
Wenn Sie in C # arbeiten, wird die oben Ihre erlauben ServiceLocatorzurückzukehren etwas , wenn GetMyDoer()aufgerufen wird, solange es hat können , do()was DependencyLocatingConstructores hat do(). Sie erhalten den Vorteil der Signaturvalidierung zur Kompilierungszeit, ohne an eine vollständige Schnittstelle 2 gekoppelt zu sein .
Also, nimm dein Gift.
Aber im Grunde, wenn es ein konkretes „Gegenteil“ von Dependency Injection, wäre es etwas anderes im Bereich der seine „Dependency - Management - Strategien.“ Wenn Sie im Gespräch eine der folgenden Methoden verwenden, wird dies unter anderem als NICHT- Abhängigkeitsinjektion erkannt :
- Service Locator Pattern
- Abhängigkeitsfinder / Speicherort
- Direkte Objekt- / Abhängigkeitskonstruktion
- Versteckte Abhängigkeit
- "Nicht-Abhängigkeitsinjektion"
1. Ironischerweise sind einige der Probleme, die DI auf höheren Ebenen löst, eine Folge der [Über-] Verwendung von DI auf niedrigeren Ebenen. Ich habe die Freude an der Arbeit auf Codebases mit unnötiger Komplexität hatte überall als Folge der Unterbringung der Handvoll von Orten , an denen die Komplexität tatsächlich geholfen ... Ich bin zwar durch schlechte Belichtung vorgespannt ist .
2. Die Verwendung des Service-Standorts ermöglicht es Ihnen auch, verschiedene Abhängigkeiten desselben Typs durch ihre funktionale Rolle im aufrufenden Code zu spezifizieren , während Sie weitgehend unabhängig davon sind, wie die Abhängigkeit aufgebaut ist. Angenommen, Sie müssen Useroder IUserfür verschiedene Zwecke lösen : ZB Locator.GetAdministrator()versus Locator.GetAuthor()- oder was auch immer. Mein Code kann nach den funktionalen Anforderungen fragen, ohne zu wissen, welche Schnittstellen er unterstützt.