In senso stretto, Iniezione delle dipendenze si oppone veramente NON Iniezione delle dipendenze - e quindi qualsiasi strategia di gestione delle dipendenze che non sia Iniezione di dipendenza.
L'accoppiamento [indesiderato], sebbene non sia esattamente un problema ortogonale, può verificarsi o essere mitigato in entrambi i modi. Questi sono entrambi accoppiati a DependencyClass
:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
è accoppiato a un particolare DependencyClass
in questo caso. Ma sono entrambi accoppiati a DependencyClass
. Il vero male, se ce n'è uno qui, non è necessariamente l'accoppiamento, è che DependencyLookupConstructor
deve cambiare se DependencyClass
improvvisamente ha bisogno delle sue proprie dipendenze iniettate 1 .
Tuttavia, questo costruttore / classe è anche più liberamente accoppiato:
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
Se lavori in C #, quanto sopra consentirà al tuo ServiceLocator
di restituire qualsiasi cosa quando viene richiamato GetMyDoer()
, purché possa do()
che DependencyLocatingConstructor
ha do()
. Ottieni il vantaggio della convalida della firma in fase di compilazione senza nemmeno essere abbinato a un'interfaccia completa 2 .
Quindi, scegli il tuo veleno.
Ma sostanzialmente, se esiste un "contrario" concreto di Dependency Injection, sarebbe un'altra cosa nel regno delle "Strategie di gestione delle dipendenze". Tra l'altro, se hai usato uno dei seguenti argomenti in conversazione, l'avrei riconosciuto come NON Iniezione di dipendenza:
- Modello localizzatore di servizio
- Indicatore di dipendenza / posizione
- Costruzione diretta di oggetti / dipendenze
- Dipendenza nascosta
- "Iniezione non dipendente"
1. Ironia della sorte, alcuni dei problemi che DI risolve a livelli più alti sono una sorta di risultato di [over-] usando DI nei livelli inferiori. Ho avuto il piacere di lavorare su basi di codice con complessità non necessaria all over come risultato di accogliere la manciata di luoghi in cui tale complessità ha effettivamente aiutato ... Sono ovviamente prevenuto dalla cattiva esposizione.
2. L'uso della posizione del servizio consente inoltre di specificare facilmente diverse dipendenze dello stesso tipo dal loro ruolo funzionale dal codice di richiamo , rimanendo comunque largamente agnostici su come viene costruita la dipendenza. Supponi di dover risolvere User
o IUser
per diversi scopi: es., Locator.GetAdministrator()
contro Locator.GetAuthor()
- o qualsiasi altra cosa. Il mio codice può chiedere ciò di cui ha bisogno funzionalmente senza nemmeno sapere quali interfacce supporta.