可能性のある複製:
依存性注入(DI)と制御の反転(IOC)の違い
私はInversion of Control、Dependency Injection、およびこれらに関連するすべてに不慣れなので、質問に具体的でない場合は失礼します:魔法のコード、良い説明、またはリンクがあるので、ようやくできます概念を区別しますか?
Dependency Injectionを使用するということは、すでにInversion of Controlを使用することを意味すると本当に思いますが、Dependency Injectionを使用せずにInversion of Controlを使用する方法はありますか?
すでにマーティンファウラーの記事を読みましたが、それでも概念が非常にわかりにくいと感じています。
Dependency Injection は、制御の反転がしばしば実装される1つの方法ですが、他の方法もあります。ウィキペディアから 制御の反転 記事:
実装手法は、使用するコンピューター言語の影響を受けます。
Javaには、制御の反転を実装する6つの基本的なテクニックがあります。これらは次のとおりです。
- factory pattern を使用する
- service locator pattern を使用する
- コンストラクターインジェクションを使用する
- セッター注入を使用して
- インターフェース注入を使用する
- コンテキスト化されたルックアップの使用
コンストラクター、セッター、およびインターフェース注入は、依存関係注入のすべての側面です。
制御の反転は、通常の制御フローが何らかの方法で「反転」される一般的な概念です。
「通常の」フローとは、従来のバッチアプリケーションフローを意味します。コードは最初から最後まで実行され、リソースを作成し、データを要求し、出力を提供します。制御フローはアプリケーション自体によって決定され、必要に応じてライブラリやシステム機能を呼び出します。これを逆にすると、アプリケーションではなくライブラリー(これらの用語を多少ゆるく使用して)が制御フローを駆動します—ある意味では、制御の逆転です。
IoCの最も一般的な例の1つは、イベントループです。イベントループでは、GUIツールキット(またはオペレーティングシステム)が制御し、アプリケーションを呼び出してイベントを処理し、入力を処理します。通常のフロー(入力の要求とその処理)は逆になり、入力プロセッサが逆方向ではなくアプリケーションを駆動します。
依存関係の注入は、制御の反転の特定の使用法であり、制御の反転が依存関係の選択と割り当てに適用されます。コンポーネントに必要なサブコンポーネントをインスタンス化させるのではなく、作成コード(アプリケーションコード、手動、またはDIコンテナーのいずれか)が必要なサブコンポーネントをインスタンス化し、コンポーネントに挿入します。