2011-11-02 10 views
11

私は自分のアプリのDIを扱うのにNinject 2.0を使用しています。ゼロのドキュメンテーションを持っていても正直であることはあまり役に立ちません。Ninject 2.0で同じタイプの複数のコンストラクタパラメータを注入

は私が署名を持つコンストラクタを持っていると言う -

ctor(IServiceFactory factory1, IServiceFactory factory2) 
{ 
    this.factory1 = factory1; 
    this.factory2 = factory2; 
} 

これら2つのサービスが同じインターフェイスを実装しますが、彼らは非常に異なった実装であると私はIEnumerable<IServiceFactory>を注入したくないので、異なる時間に使用されています。

私の質問は、私がインスタンスをバインドしているときに、どのようにNinjectにそれぞれ何を注入するよう指示するのでしょうか?

ありがとうございます。

更新

コードはレモのリンクを読んだ後に終わるだろう見たい人のために、...ここでは簡単です。 (私はC#は、パラメータの属性を持っていた実現しなかった!)あなたは実装が全く異なることを行う必要がある場合は、同じインタフェースを使用することが正しいかどうかを自問する必要があるすべての

//abstract factory 
public interface IServiceFactory 
{ 
    Service Create(); 
} 

//concrete factories 
public class Service1Factory : IServiceFactory 
{ 
    public IService Create() 
    { 
     return new Service1(); 
    } 
} 

public class Service2Factory : IServiceFactory 
{ 
    public IService Create() 
    { 
     return new Service2(); 
    } 
} 

//Binding Module (in composition root) 
public class ServiceFactoryModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IServiceFactory>() 
      .To<Service1Factory>() 
      .Named("Service1"); 

     Bind<IServiceFactory>() 
      .To<Service2Factory>() 
      .Named("Service2"); 
    } 
} 

//consumer of bindings 
public class Consumer(
    [Named("Service1")] service1Factory, 
    [Named("Service2")] service2Factory) 
{ 
} 

答えて

10

まず。通常、インタフェースはコンシューマと実装の間の契約です。したがって、消費者が異なることを期待している場合は、異なるインターフェースを定義することを検討するかもしれません。

条件付きバインディングを使用する必要があるインターフェイスと同じインターフェイスを使用する場合は、これがどのように行われるかについてのドキュメントを参照してください:

https://github.com/ninject/ninject/wiki/Contextual-Binding

https://github.com/ninject/ninject/wiki/Conventions-Based-Binding

+0

おかげレモ。実際には、抽象的なファクトリの異なる実装であり、UI内にタブを作成して、同じことをするのです...異なる理由からです。 – Stimul8d

+1

あなたは正しく理解していないと思います。消費者の視点からは、彼らは同じことではありません。インターフェイスは、消費者の観点から定義する必要があります。例えば。あなたがファクトCreateFruit()を持っていて、消費者がバナナ用とバナナ用の2つの実装を期待しているならば、必要に応じて、バナナCreateBanana()とOrange CreateOrange()それらは果物としてのみです。 –

+0

私は参照してください。私は、具体的な工場クラスを持つ抽象的な工場ではなく、工場の方法を使用することを提案しています。これはオプションですが、ファクトリクラス自体には注入が必要な依存関係(この場合はサブ画面)があります。これらの依存関係は、具体的なファクトリやコンストラクタインジェクションで解決するのがずっと簡単ですが、ファクトリメソッドではなく、Ninjectには他のいくつかの魔法がありますか? – Stimul8d

関連する問題