依存性注入に関するウィキペディアのページの短所セクションには、次のことが記載されています。
依存性注入は、サブシステムのユーザーにそのサブシステムのニーズを提供するように要求することにより、結合を増加させます。
依存性注入に対する記事へのリンク付き。
依存性注入により、クラスは具体的な実装の代わりにインターフェースを使用します。その結果、結合が減少するはずです。
私は何が欠けていますか?依存性注入はどのようにクラス間の結合を増加させますか?
依存性注入に関するウィキペディアのページの短所セクションには、次のことが記載されています。
依存性注入は、サブシステムのユーザーにそのサブシステムのニーズを提供するように要求することにより、結合を増加させます。
依存性注入に対する記事へのリンク付き。
依存性注入により、クラスは具体的な実装の代わりにインターフェースを使用します。その結果、結合が減少するはずです。
私は何が欠けていますか?依存性注入はどのようにクラス間の結合を増加させますか?
回答:
だから、私は何が欠けていますか?
依存性注入により、クラスとその依存性の間の結合が減少します。しかし、クラスとそのコンシューマー(コンシューマーは作成するためにより多くの情報を必要とするため)と依存関係とそのコンシューマー(コンシューマーは使用する依存関係を知る必要があるため)の間の結合を増加させます。
多くの場合、これは良いトレードオフです。クラスは、インターフェースを越えた依存関係の詳細を知らないようにし、特定のコードを結び付けるのはアプリケーションの責任であるべきです。
S
データベース接続に依存するサブシステムがあるとしますD
。依存性注入を使用しない場合、との間には比較的密接な結合がS
あります。これは、使用方法と作成方法の両方を知る必要があるD
ためです。ただし、システムの残りの部分は、との間のこの依存関係を至福に気付かない可能性があります。S
D
S
D
依存関係の注入では、を作成する方法を知識から削除するためS
、D
との間の結合が緩やかになります。使用方法を知る必要があります。全体的な結合が増加するのは、システムの他の部分が現在、それを作成する方法を知っている必要がある可能性があるためです。カップリングのこの増加の範囲は、依存性がどのように注入されるかに依存します。S
D
S
D
D
S
S
にニーズの依存関係D
を作成する方法の知識と可能性。S
そこを通ってD
注入されますニーズに依存D
し、おそらく知識がどのように作成します。どちらの場合でも、依存するクラスの数はD
増加D
し、システムのどこかにまだ作成するための知識が必要です。これにより、結合が全体的に増加します。
S
のファクトリを提供する必要があります。D
つまり、そのS
使用D
(または少なくともそのインターフェイス)を知る必要があります。
カップリングが増加することに強く反対します。
依存関係の注入を行わないと、サブシステムと依存関係の具体的な実装との間に密結合が生じます。
依存性注入により、サブシステムを依存性の実装から切り離しました。
消費者がサブシステムに必要な依存関係に密接に結合していることを示唆しているため、消費者とこのサブシステム間の結合を増加させるという議論は非常に疑問です。つまり、消費者と依存関係を結び付ける密結合コードを書いているということです。理想的には、すべてのコードが分離されています。
コンストラクター注入:
依存関係の解決は、依存関係注入コンテナーまたはファクトリーによって処理されます。コンシューマーは、依存性注入コンテナーまたはファクトリーからサブシステムの具体的な実装を取得できます。
消費者は、サブシステムのコンストラクターがどのように見えるかを知る必要はありません。サブシステムの依存関係へのカップリングはありません。
メソッドインジェクション:
コンシューマがコンテナまたはファクトリから依存関係の具体的なインスタンスを取得する(またはメソッド/コンストラクタをインジェクトする)必要があり、それをメソッドにインジェクトする必要があることを除いて、コンストラクタインジェクションと同じです。繰り返しますが、消費者は依存関係の具体的な実装に結合されていません。
TL; DR サブシステムでの依存性注入の最悪のケースは、カップリングがコンシューマコードにシフトされることです。カップリングの全体的な増加はありません。
最良のケースは、すべてのシステムが疎結合になり、依存性注入が依存性注入コンテナーまたは工場を通じて制御されることです。