2011-08-01 10 views
4

この質問はあまりにも愚かではないことを願っています。より高度なプログラミングの原則を習得しようとしているため、Ninjectを使用して依存性注入に慣れようとしていました。 。依存性注入:マルチプロジェクトソリューションを使用するときに注入する方法

私のモデルはいくつかの異なる.dllプロジェクトに分割されています。 1つのプロジェクトはモデル仕様(インタフェース)を定義し、他の2つはこれらのインタフェースを実装します。すべてのモデルプロジェクトは、ある種のデータベースシステムを使用する必要があるため、すべてのデータベースロジックを実装するさらに別の.dllにアクセスする必要があります。しかし、それらのすべてが私のデータベースオブジェクトの同じインスタンスにアクセスできることは重要です。したがって、モデルごとに1つのインスタンスを作成するだけでは不十分です。

しかし、依存性注入を使用してこれを達成する方法はわかりません。私の最初の考えは、別個のDIプロジェクトを作成し、すべてのインターフェイスをそれぞれの実装にバインドすることでした。したがって、DIプロジェクトは他のすべてのプロジェクト(モデルインターフェイス&の実装、データベースシステムなど)への参照が必要でした。そして、DIシステム(Ninject)からデータベースシステムを要求する必要があるなど、DIプロジェクトにアクセスする必要があります。もちろん、これは循環参照(DIプロジェクトにモデル化してモデル化するDIプロジェクトをバインドする)を作成するので不可能です。

短い話ですが、モデルインターフェイスを実装にバインドできるプログラミングパターンが必要ですが、モデル実装ではNinjectから他の依存関係を要求することもできます。

IModel1 -> Model1 
IModel2 -> Model2 (different project) 
IDatabase -> Database (different project) 
Model1 -> request IDatabase -> get Database instance 
Model2 -> request IDatabase -> get the same Database instance 

は、私が立ち往生し、アイデアの出だ瞬間に、提案のカップルを得るために喜んでいるだろう;) ありがとう!

+0

これはウェブサイト用ですか? –

答えて

1

クライアントアプリケーションは、Ninjectを使用して実際のデータベースとモデル実装を注入します。

したがって、クライアントアプリケーションは、データベース、idatabase、モデル、およびimodelプロジェクトを参照する必要があります。

idatabaseプロジェクトとデータベースプロジェクトは、モデルオブジェクトまたはモデルオブジェクトのコレクションを返すため、モデルプロジェクトを参照する必要があります。 repository patternをご覧ください。

あなたのモデルはあなたのプロジェクトを参照する必要はありません。

+0

あなたの答えをありがとう!だから、私のモデルが依存関係を受け取る唯一の方法は、コンストラクタインジェクションによるものだと思いますよね?これまでは、Ninject.kernel.Get (Ninjectはカーネルのシングルトンプロバイダ)を使用していましたので、必要に応じて自分のDB用に新しいセッションを作成しました。時には同じメソッド内で数回です。この特定のケースでは、データベースオブジェクトからセッションを直接要求するだけでは問題はありませんが、コンストラクタインジェクション以外のDIメソッドが必要な場合はありませんか? – James

+1

POCO(http://en.wikipedia.org/wiki/Plain_Old_CLR_Object)を使用している場合は、モデルオブジェクトに何も注入する必要はありません。 –

7

例えば、 彼らはDIシステム (Ninject)からデータベースシステムを要求する必要があるだろう、以来、あなたは依存性注入を使用した場合のモデルは

をDIプロジェクトへのアクセスが必要になり、依存関係を注入するDIフレームワークなので、モデルはDIフレームワークにアクセスする必要はありません。モデルオブジェクトはDIコンテナに尋ねるべきではありません。あなたのオブジェクトがコンテナに依存性を求めているときは、それは依存性注入と呼ばれるのではなく、サービスロケータと呼ばれます。サービスロケータis considered an anti-pattern

私が最初に考えたのは別々のDI-プロジェクト

あなたは、単一のアプリケーションを持っている(つまり、ウェブアプリ)、完全に最後にDIコンテナを設定され行うには通常のものを作成することでしたアプリケーションのエントリポイントに可能な限り近づけます。これはComposition Rootと呼ばれます。

すべてのモデル事業は、データベース・システムのいくつかの並べ替えを使用する必要があるので、それら すべては私のすべてのデータベース ロジック

はPOCO(昔ながらのCLRオブジェクトを作ってみましょう実装してさらに別の.dllファイルへのアクセスを必要とします)モデル/エンティティオブジェクトを作成するか、少なくともこれらのオブジェクトが他のプロジェクトを参照する必要がないようにして、アーキテクチャ(およびテスト)をはるかに簡単にします。

関連する問題