2017-03-24 16 views
1

私はDIを扱うのは初めてです。私がDIのすべてのことを誤解した場合は、修正してください。各クラスライブラリの依存性注入コンテナ

これらは私のプロジェクトのほんの一部です:

  1. Webアプリケーション/ウェブAPIプロジェクト - Automapper(現在のプロジェクトにのみ適用構成)
  2. サービス(クラスライブラリ)を注入+サービスクラスに依存しますが - に依存しますデータクラス+私の意図は、それを持つ各プロジェクトを持っていることでした

  • データ(クラスライブラリ)(現在のプロジェクトにのみ適用構成)Automapperを注入自分自身のDIコンテナ(Unity DI)各プロジェクトが独自のDIコンテナを持つことができるかどうかはわかりません。

    私は記事を読んで、それができないことを示しています(正しく解釈するかどうかわかりませんが)

    できない場合は、誰でも説明することができます。これをどのように達成でき、アプリケーションレイヤDIのデータレイヤにクラスを登録したくないですか。

    にはに独自のDIがある場合、インスタンスとしてIMapperを登録すると、他のレイヤのIMapperより優先されますか?

  • 答えて

    2
    私の意図は、各プロジェクトに独自のDIコンテナを持たせることでした(Unity DIと言います)。各プロジェクトが独自のDIコンテナを持つことができるかどうかはわかりません。

    として、あなたはすべてのオブジェクトグラフを構成する必要があり、hereを説明します。アプリケーションのエントリポイントにできるだけ近い

    。組成ルートモジュールが一緒に構成されているアプリケーションで(好ましくは)固有の位置である

    この場所は組成ルート呼ばれます。

    つまり、DIコンテナを使用してアプリケーションの依存関係を設定する唯一の場所は、スタートアッププロジェクトです。他のすべてのプロジェクトはコンテナを無視し、純粋にコンストラクタインジェクションを適用する必要があります。

    私はそれはそれを行うことができますが、あなたはいけない

    を行うことができないことを示し、記事の一部を読みました。

    IMapperをインスタンスとして登録するときに、各プロジェクトが独自のDIを持つことができる場合は、他のレイヤのIMapperより優先されますか?

    この問題は、構成ルートパターンを適用すると消えます。 Composition Rootでは、依存関係を取得するコンポーネントを完全に制御できます。

    PRO TIPthis bookをお読みください。

    +0

    これは、service.dllのすべてのコンシューマが、依存関係を含めるために複合ルートを持つ必要があることを意味しますか?このDLLを公開する必要がある場合はどうすればよいですか? – Leonz

    +1

    @Leonz:再利用可能なライブラリを作成する場合、[this](http://blog.ploeh.dk/2014/05/19/di-friendly-library/)と[this](http://blog.ploeh。 dk/2014/05/19/di-friendly-framework /)のアドバイスが適用されます。 – Steven

    +0

    "service.dllのすべてのコンシューマが、依存関係を含めるには複合ルートを持つ必要がありますか?スタートアッププロジェクトのみがコンポジットルートを持ち、通常コンポジションルートは[再利用されません](http://blog.ploeh.dk/2015/01/06/composition-root-reuse/)です。 – Steven