web-dev-qa-db-ja.com

DIとIoCの違いは何ですか?

可能性のある複製:
依存性注入(DI)と制御の反転(IOC)の違い

私はInversion of Control、Dependency Injection、およびこれらに関連するすべてに不慣れなので、質問に具体的でない場合は失礼します:魔法のコード、良い説明、またはリンクがあるので、ようやくできます概念を区別しますか?

Dependency Injectionを使用するということは、すでにInversion of Controlを使用することを意味すると本当に思いますが、Dependency Injectionを使用せずにInversion of Controlを使用する方法はありますか?

すでにマーティンファウラーの記事を読みましたが、それでも概念が非常にわかりにくいと感じています。

13

Dependency Injection は、制御の反転がしばしば実装される1つの方法ですが、他の方法もあります。ウィキペディアから 制御の反転 記事:

実装手法は、使用するコンピューター言語の影響を受けます。

Javaには、制御の反転を実装する6つの基本的なテクニックがあります。これらは次のとおりです。

  1. factory pattern を使用する
  2. service locator pattern を使用する
  3. コンストラクターインジェクションを使用する
  4. セッター注入を使用して
  5. インターフェース注入を使用する
  6. コンテキスト化されたルックアップの使用

コンストラクター、セッター、およびインターフェース注入は、依存関係注入のすべての側面です。

9
Bill the Lizard

制御の反転は、通常の制御フローが何らかの方法で「反転」される一般的な概念です。

「通常の」フローとは、従来のバッチアプリケーションフローを意味します。コードは最初から最後まで実行され、リソースを作成し、データを要求し、出力を提供します。制御フローはアプリケーション自体によって決定され、必要に応じてライブラリやシステム機能を呼び出します。これを逆にすると、アプリケーションではなくライブラリー(これらの用語を多少ゆるく使用して)が制御フローを駆動します—ある意味では、制御の逆転です。

IoCの最も一般的な例の1つは、イベントループです。イベントループでは、GUIツールキット(またはオペレーティングシステム)が制御し、アプリケーションを呼び出してイベントを処理し、入力を処理します。通常のフロー(入力の要求とその処理)は逆になり、入力プロセッサが逆方向ではなくアプリケーションを駆動します。

依存関係の注入は、制御の反転の特定の使用法であり、制御の反転が依存関係の選択と割り当てに適用されます。コンポーネントに必要なサブコンポーネントをインスタンス化させるのではなく、作成コード(アプリケーションコード、手動、またはDIコンテナーのいずれか)が必要なサブコンポーネントをインスタンス化し、コンポーネントに挿入します。

6