2012-03-03 16 views
0

私はちょうどIoCコンテナを使い始めており、まずはNinjectを手に入れました。私はあなたがカーネルに組み込むことができる別々のモジュールの原則を理解しています。しかし、私のコードのどこにも最初の行を置いて、私がサービス層から何かを具体的に実装しようとしているのであれば、私は不思議です。Ninject/IoC StandardKernelの適切な初期化

IKernel kernel = new StandardKernel(new SimpleModule()); 
// example: getting my ContentService 
IContentService contentService = kernel.Get<IContentService>(); 

私はモジュールとあらゆる方法でカーネルまで、私は本当に新しいべきContentServiceを使用する10個の方法でクラスを持っている場合は?コード臭のようです。ほとんどの開発者はNinjectでこれをどのように処理しますか?コンシューマークラスでこれを行う適切な方法を示すオンラインの記事はありますか?

答えて

1

依存性注入(DI)とサービスロケーション(SL)という基本的にIoCを使用する2つの方法があります。 依存注入を扱う場合、クラス外からの依存関係を提供します。一般的には、依存関係をクラスコンストラクターに注入(渡し)するか、setterを使用してこれを行います。例:この場合

public class SomeClass { 
     public ISomeDependency SomeDependency {get;set;} 

     public SomeClass(ISomeOtherDependecy someOtherDependency) { 
      //... 
     } 
} 

、あなたは、プロパティを介してISomeDependency実装を提供することができ、あなたは、コンストラクタ経由ISomeOtherDependecyの実装を提供する必要があります。両方の方法をサポートします。

(SL)を行うための他の方法は、あなたがたとえば、あなたが必要とする瞬間にあなたの依存関係のために要求することができます:

public void DoSomeAction() { 
    ISomeDependency someDependency = MyServiceLocatorImpl.GetInstance<ISomeDependence>() 
} 

あなたはSLのアプローチ(またはハイブリッド1)を使用する予定がある場合は、 Common Service Locator(Ninject has support)を使用できます。 IoCエンジンを後で簡単に切り替えることができます。

+0

Common Service Locatorを使用するルートを辿ると、ここに記載されているNinject List <>機能をあきらめますか:http://stackoverflow.com/questions/7959709/ninject-multicasting – BuddyJoe

+0

私はそれについてはわかりませんが、 Common Service Locatorが必要とするインタフェースの実装に依存しているためです。それはテストの価値がある。とにかく、私のopnion数が、サービスの場所を使用しないでください。依存関係を注入することでテストを書くのが簡単です(必要なときに質問するのではなく)。 – Fernando

+0

私はそれに背を向けています(SL)。単純なWinFormアプリケーションのようにいくつかのプロジェクトがどのようにDIで動作するかのように私の頭を抱かせようとしています。 – BuddyJoe

3

ContentServiceを使用する10のメソッドを持つクラスがある場合は、すべてのメソッドでモジュールとカーネルを実際に新しくする必要がありますか?

いいえ、あなたは、このクラスが(それはそのメソッドの内部で、それに依存するため)コンストラクタパラメータとしてIContentServiceを取り、その後、あなたにこのクラスのインスタンスを提供するために、カーネルを依頼する必要があります。あなたのクラスは、DIコンテナ(あなたのケースではNinject)について何も知らないはずです。彼らはそれを決して参照するべきではない。

+0

私はあなたがSLルートの代わりにDIルートに行くかどうかを理解しようとしています。新しいカーネルを要求するクラスは1つだけ必要ですか? WinFormアプリケーションでは、プログラムクラスがこれを行い、他のすべてのサービスにアクセスできるように、メインフォーム(Form1)にマスターサービスを注入する必要がありますか? – BuddyJoe

+0

または、UIレイヤーまたはWCFレイヤーから、そのレイヤーの初期化中にカーネルを新規作成し、カーネルへの参照を保持するプライベートクラスレベルの変数を設定できると思います。 – BuddyJoe

関連する問題