2017-01-25 12 views
1

を異なるインタフェースの実装をバインドしますNinject - 私は(Ninjectを使用)DIに新たなんだとばかり概念を学ぶために始めたが、私はこれを理解するためにしばらくの間、私の頭を悩まてきた同じクラスに

私のプログラムに同じクラスの別の使用法があるとします(ProcessContextの例)。

ファーストクラス(SomeClass):にProcessContextインスタンスを注入したいと思います。

2番目のクラス(SomeOtherClass):をProcessContextインスタンスに注入したいと思います。

Ninjectを使用してバインディングを実行する方法を教えてください。

public class Implement1 : IAmInterace 
{ 
    public void Method() 
    { 
    } 
} 

public class Implement2 : IAmInterace 
{ 
    public void Method() 
    { 
    } 
} 

public class ProcessContext : IProcessContext 
{ 
    IAmInterface iamInterface; 
    public ProcessContext(IAmInterface iamInterface) 
    { 
     this.iamInterface = iamInterface; 
    } 
} 

public class SomeClass : ISomeClass 
{ 
    public void SomeMethod() 
    { 
     // HERE I WANT TO USE: processcontext instance with Implement1 
     IProcessContext pc = kernel.Get<IProcessContext>();    
    } 
} 

public class SomeOtherClass : ISomeOtherClass 
{ 
    public void SomeMethod() 
    { 
     // HERE I WANT TO USE: processcontext instance with Implement2 
     IProcessContext pc = kernel.Get<IProcessContext>();    
    } 
} 
+0

[戦略パターン](http://stackoverflow.com/a/32415954/181087)のように、パラメータに基づいて実装を選択できるように思えます。別の[例](http://stackoverflow.com/a/31971691/181087)は、抽象的なファクトリと同じパターンを組み合わせて、その場でインスタンスを取得します。 – NightOwl888

答えて

0

これにはnamed bindingsを使用できます。

Bind<IProcessContext>() 
    .To<ProcessContext>() 
    .WithConstructorArgument("iamInterface", context => Kernel.Get<Implement1>()) 
    .Named("Imp1"); 

Bind<IProcessContext>() 
    .To<ProcessContext>() 
    .WithConstructorArgument("iamInterface", context => Kernel.Get<Implement2>()) 
    .Named("Imp2"); 

kernel.Get<IProcessContext>("Imp1"); 
+0

ありがとうございます! SimpleInjectorでこれを行う方法をさらに説明できますか? – ohadinho

+1

@ohadinho申し訳ありません、私はSimpleInjectorの経験がありません。そのライブラリの新しい質問を開始する必要があります。 –

+0

SimpleInjectorにcontextbasedinjectionが見つかりました: http://simpleinjector.readthedocs.io/en/latest/advanced.html#context-based-injection – ohadinho

0

あなたは、このように簡単に追加コンストラクタのパラメータを注入することができます今のところ

public void SomeMethod() 
{ 
    var foo = new Ninject.Parameters.ConstructorArgument("iamInterface", new Implement2()); 
    IProcessContext pc = kernel.Get<IProcessContext>(foo);    
} 

を、私はninjectにアクセスすることはできません。だからそれが期待どおりに動かないか教えてください。

+0

私の例では、2つのインターフェイスしか使用していません。 「foo」には同じ問題があります。もしImplement2がコンストラクタでIAmInterface2を取得したら、私は再びConstructorArgumentを設定する必要があります。 簡単な方法はありませんか? – ohadinho

+0

@ohadinhoあなたの場合、具体的な型を 'IProcessContext'に渡したいと思っています。実際には、DIコンテナを使用したくありません。しかし、 'Implement2'が引数として他のインタフェースを必要とする場合は、必要な引数を注入する必要があります。私は通常、 'Ninject'自体からインスタンスを取得し、' Ninject'にパラメータを渡すことを意味します。 – Feriloo

0

Ninjectは返す実装を知る方法がないため、これは不可能です。しかしながら;変数を渡してIProcessContextの新しいインスタンスを作成すると、Ninjectは適切なコンストラクタを使ってその実装を探し、それを返します。

関連する問題