web-dev-qa-db-ja.com

依存性注入のコンテキストでのコンポジションルートとは何ですか?

私は依存性注入を調査しており、composition rootという用語が至る所で使用されています。それは何ですか?

69
Thomas

コンポジションルートは、依存関係注入コンテナーを使用して、アプリケーションのオブジェクトグラフのコンポジションが行われる、アプリケーション内の単一の場所です(これがどのように行われるかは関係ありませんが、コンテナーを使用するか、または- 純粋なDI )。

これが発生する場所は1つだけであり、コンテナーをコンポジションルートの外で使用する必要はありません。

以下にリンクされている回答の1つから引用:

実際には、これは、アプリケーションのルートでコンテナーを構成する必要があることを意味します。

  • デスクトップアプリでは、Mainメソッド(またはそれに非常に近い)にあります
  • ASP.NET(MVCを含む)アプリケーションでは、Global.asaxにあります
  • WCFでは、ServiceHostFactoryにあります
  • 等.

良い答えがあります ここ これはこれについてもう少し説明します。

この答え も参照してください。

64
Sam Holder

Mark Seemannが、コンポジションルートのデザインパターンに関する素晴らしい記事を書いています。

この記事の要点は次のとおりです。

コンポジションルートは、モジュールが一緒に構成されるアプリケーション内の(できれば)一意の場所です。

アプリケーションのみがコンポジションルートを持つ必要があります。ライブラリとフレームワークはすべきではありません。

DIコンテナーは、コンポジションルートからのみ参照する必要があります。他のすべてのモジュールはコンテナへの参照があってはなりません。

http://blog.ploeh.dk/2011/07/28/CompositionRoot/

これらの原則を念頭に置いて、Di-Ninjaと呼ばれる独自のJavaScript依存性注入フレームワークを作成しました

https://github.com/di-ninja/di-ninja

私が知っているように、Composition-Root設計パターンを実装するのはJavaScriptで唯一のものであり、そのドキュメントは、それがどのように機能するかを示す別の良い例になる可能性があります。

NodeJS、ブラウザ(WebpackまたはUMD/AMD)、およびReact-Nativeで動作します。

3
Jo-Go