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();
}
DependencyLookupConstructor
ist DependencyClass
in 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 DependencyLookupConstructor
muss sich ändern, wenn DependencyClass
plö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 ServiceLocator
zurückzukehren etwas , wenn GetMyDoer()
aufgerufen wird, solange es hat können , do()
was DependencyLocatingConstructor
es 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 User
oder IUser
fü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.