はい、これを行うことはできますが、おそらく本当に必要なものではありません。コンテナが独自の依存関係のインスタンス化を実際に担当していない場合、その依存関係はおそらくがコンストラクタ引数を共有するべきではありません。
私は私はあなたが何をしようとして知っているかなり確信している、と推奨されるアプローチは、特にあなたの一つの容器のためのユニークな結合を作成し、以下の例のように、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
バインディングを使用して解決できます。
あなたは何をしようとしているかについてより多くの情報を提供できますか?子にパラメータを渡すことは可能です。しかし、ほとんどのシナリオでは、これは最善の解決策ではありません。 –