2016-10-14 3 views
0

でコンストラクタ・インジェクションを解決します。NInject:私はこれらのインタフェースとクラスを作成した二つのパラメータ

interface IInterpreter. 
interface IViz. 
interface IVizDescriptor. 

class IntOne : IInterpreter. 

と、

class VizDescOne : IVizDescriptor { 
    VizDescOne(string title, Type type, SchemaType schemaType, string desc) 
    { } 
} 

と、

class VizOne : IViz { 
    public VizOne (IntOne, IVizDescriptor) 
    { 
    } 
} 

VizOneの場合は最初のパラメータコンストラクタにIntOneを注入するためにIInterpreterIntOneの間にバインドを作成できることが分かりました。

問題は、VizDescOneの適切なバインディングを作成する方法がないことです。 VizDescOneのコンストラクタパラメータがそれぞれの状況にあまり依存していないため、バインディングを作成できません。

manuallyを提供し、VizOne (IntOne, IVizDescriptor)コンストラクタを解決する方法はありますか?

しかし、IVizDescriptorあなたは多くのオプションを持っている

+1

'title'、' type'、 'desc'のようなパラメータは実行時の値であると思います。アプリケーションの存続期間中一定ではありません。 [ランタイムデータをコンポーネントに注入するためにコンテナを乱用しないでください](https://www.cuttingedge.it/blogs/steven/pivot/entry.php?id=99)。 – Steven

答えて

1

任意の具体的な状況のあまり依存します

  1. あなたはコンストラクタ 引数を持つVizDescOneにIVizDescriptorをバインドすることができます。

    kernel.Bind<IVizDescriptor>().To<VizDescOne>() 
         .WithConstructorArgument("title", "someTitle").WithConstructorArgument("type", typeof(int))... 
    
  2. IVizDescriptorを定数にバインドすることができます。

    IVizDescriptor vizDescOne = new VizDescOne(...); 
    kernel.Bind<IVizDescriptor>().ToConstant(vizDescOne); 
    
  3. あなたはメソッドにIVizDescriptorをバインドすることができます。

    kernel.Bind<IVizDescriptor>().ToMethod(o=> new VizDescOne(...)); 
    

あなたはこれらのオプションの詳細といくつかのhereよりhereを読むことができます。

サイドスタンドとして、@ Stevenのコメントと、彼がリンクした記事を読むことをお勧めします。なぜなら、コンストラクタのパラメータが実行時の値であれば、デザインを再考する必要があるからです。

関連する問題