À strictement parler, l' injection de dépendance ne s'oppose vraiment que PAS à l' injection de dépendance - et donc à toute stratégie de gestion des dépendances qui n'est pas l' injection de dépendance.
Le couplage [indésirable], bien qu'il ne s'agisse pas exactement d'un problème orthogonal, peut se produire ou être atténué de toute façon. Ces deux éléments sont couplés à DependencyClass
:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
est couplé à un particulier DependencyClass
dans ce cas. Mais, ils sont tous deux couplés à DependencyClass
. Le vrai mal, s'il y en a un ici, n'est pas nécessairement le couplage, c'est qu'il DependencyLookupConstructor
doit changer si DependencyClass
soudainement besoin de ses propres dépendances injectées 1 .
Cependant, ce constructeur / classe est encore plus faiblement couplé:
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
Si vous travaillez en C #, la volonté ci - dessus permettra à votre ServiceLocator
retourner quoi que ce soit quand GetMyDoer()
est invoqué, tant qu'il a peut do()
ce l' DependencyLocatingConstructor
a do()
. Vous bénéficiez de la validation de la signature au moment de la compilation sans même être couplé à une interface complète 2 .
Alors, choisissez votre poison.
Mais fondamentalement, s'il y a un «opposé» concret à l'injection de dépendance, ce serait autre chose dans le domaine des «stratégies de gestion de la dépendance». Entre autres, si vous avez utilisé l'un des éléments suivants dans la conversation, je le reconnais comme n'étant PAS une injection de dépendance:
- Modèle de localisateur de service
- Localisateur / emplacement de dépendance
- Construction directe objet / dépendance
- Dépendance cachée
- "Pas d'injection de dépendance"
1. Ironiquement, certains des problèmes que DI résout à des niveaux plus élevés sont en quelque sorte le résultat de [l'utilisation excessive] de DI dans les niveaux inférieurs. J'ai eu le plaisir de travailler sur des bases de code avec une complexité inutile partout en raison de l'adaptation à la poignée d'endroits où cette complexité a réellement aidé ... Je suis certes biaisé par une mauvaise exposition.
2. L'utilisation de l'emplacement du service vous permet également de spécifier facilement différentes dépendances du même type par leur rôle fonctionnel à partir du code appelant , tout en restant largement indépendant de la façon dont la dépendance est créée. Supposons que vous ayez besoin de résoudre User
ou IUser
à des fins différentes: par exemple, Locator.GetAdministrator()
contre Locator.GetAuthor()
- ou autre chose. Mon code peut demander ce dont il a besoin fonctionnellement sans même savoir quelles interfaces il prend en charge.