2011-03-14 5 views
2

子クラスのコンストラクタにコンストラクタ引数を渡す方法を見つけようとしています。 これらのオブジェクトは不変なので、コンストラクタ引数を使用することをお勧めします。Ninjectでコンストラクタを継承する

私が遭遇した問題はConstructorArgument子インスタンスに継承されていないと、次の文は互換性がないということである。

_parsingProcessor = _kernel.Get<IParsingProcessor>(new ConstructorArgument("dataFilePath", dataFilePath); 

_parsingProcessor = _kernel.Get<IParsingProcessor>(new Parameter("dataFilePath", dataFilePath, true); 

だから、どのように継承ConstructorArgumentを得ることができますし、もしそれが意味をなさないのであれば、いつParameterクラスを新しいものにするのでしょうか?

+1

あなたは何をしようとしているかについてより多くの情報を提供できますか?子にパラメータを渡すことは可能です。しかし、ほとんどのシナリオでは、これは最善の解決策ではありません。 –

答えて

3

はい、これを行うことはできますが、おそらく本当に必要なものではありません。コンテナが独自の依存関係のインスタンス化を実際に担当していない場合、その依存関係はおそらくがコンストラクタ引数を共有するべきではありません。

私は私はあなたが何をしようとして知っているかなり確信している、と推奨されるアプローチは、特にあなたの一つの容器のためのユニークな結合を作成し、以下の例のように、WhenInjectedInto条件付き結合構文を使用することです。

public class Hello : IHello 
{ 
    private readonly string name; 

    public Hello(string name) 
    { 
     this.name = name; 
    } 

    public void SayHello() 
    { 
     Console.WriteLine("Hello, {0}!", name); 
    } 
} 

これは、誰がIHelloを求めているかに応じて、変更したいコンストラクタ引数をとるクラスです。のは、それは、この退屈なコンテナクラスだとしましょう:今

public class MyApp : IApp 
{ 
    private readonly IHello hello; 

    public MyApp(IHello hello) 
    { 
     this.hello = hello; 
    } 

    public virtual void Run() 
    { 
     hello.SayHello(); 
     Console.ReadLine(); 
    } 
} 

、ここであなたはバインディングを行う方法は次のとおりです。

public class MainModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IApp>().To<MyApp>(); 
     Bind<IHello>().To<Hello>() 
      .WithConstructorArgument("name", "Jim"); 
     Bind<IHello>().To<Hello>() 
      .WhenInjectedInto<MyApp>() 
      .WithConstructorArgument("name", "Bob"); 
    } 
} 

基本的にすべてこのない限り「ジム」である必要がありますnameを言ってやっているバインディングそれはHelloによって要求されています。この場合はそうですが、代わりに "Bob"という名前が付けられます。あなたは絶対にあなたが本当に行動をカスケード接続したい、これがあることを理解特定ある場合


非常に危険と脆い、あなたはバインドメソッドを使用してごまかすことができます。私たちは今、いくつかの不特定の目的のためにMyAppクラスにname引数を追加したと仮定すると、結合は次のようになります。

Bind<IHello>().ToMethod(ctx => 
    ctx.Kernel.Get<Hello>(ctx.Request.ParentContext.Parameters 
     .OfType<ConstructorArgument>() 
     .Where(c => c.Name == "name") 
     .First())); 

、これはあなたが行う前に、欲しいものであることをあなたがあることを確認してくださいしてくださいそれ。それは簡単に見えますが、単純なリファクタリング中に壊れる可能性も非常に高く、私が見た「カスタマイズされた依存関係」シナリオの95%は、代わりにWhenInjectedIntoバインディングを使用して解決できます。

関連する問題