厳密に言えば、依存性注入は実際にはNOT依存性注入にのみ反対します。したがって、依存性注入ではない依存関係管理戦略にのみ反対します。
[望ましくない]カップリングは、厳密に直交する問題ではありませんが、どちらの方法でも発生するか、軽減される可能性があります。これらは両方とも以下に結合されDependencyClass
ます。
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
DependencyClass
この場合、特定のものに結合されます。しかし、それらは両方とも結合されていDependencyClass
ます。本当の悪は、ここに存在する場合、必ずしもカップリングではありません。突然、独自の依存性を注入する必要があるDependencyLookupConstructor
場合、変更するDependencyClass
必要があります1。
ただし、このコンストラクター/クラスはさらに疎結合です。
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
C#で作業している場合、上記は、呼び出されたときに何でもServiceLocator
返すことができるようにします。完全なインターフェイス2に結合することなく、コンパイル時の署名検証のメリットを享受できます。GetMyDoer()
do()
DependencyLocatingConstructor
do()
だから、あなたの毒を選んでください。
しかし、基本的に、依存性注入の具体的な「反対」がある場合、それは「依存性管理戦略」の領域の別のものになります。とりわけ、会話で次のいずれかを使用した場合、依存性注入ではないと認識します。
- サービスロケーターパターン
- 依存関係ロケーター/場所
- オブジェクト/依存関係の直接構築
- 非表示の依存関係
- 「非依存性注入」
1.皮肉なことに、DIが上位レベルで解決する問題の一部は、下位レベルでDIを使用しすぎた結果です。私は不必要な複雑さを持つコードベースに取り組んでの喜び持っていたすべてのオーバーとしてその複雑さは、実際に助けた場所の一握りを収容した結果を...私は確かに悪いの暴露によってバイアスされています。
2.サービスの場所を使用すると、依存関係がどのように構築されているかについて大部分はわからないまま、呼び出しコードからの機能的役割によって同じタイプの異なる依存関係を簡単に指定できます。解決する必要がある場合User
やIUser
、さまざまな目的で、たとえば、Locator.GetAdministrator()
対、またはその他のことを行う必要があるとしますLocator.GetAuthor()
。私のコードは、サポートするインターフェイスを知らなくても、機能的に必要なものを尋ねることができます。