はい、これを行うことができますが、それはおそらくあなたが本当に望んでいるものではありません. コンテナーが実際に自身の依存関係をインスタンス化する責任を負わない場合、その依存関係はおそらくそのコンストラクター引数を共有すべきではありません - それは単に意味がありません。
私はあなたが何をしようとしているのかを知っていると確信しています。推奨されるアプローチは、WhenInjectedInto
以下の例のように、1 つのコンテナー専用の一意のバインディングを作成し、条件付きバインディング構文を使用することです。
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
、は "Jim" であるべきだと言っているだけです。この場合はそうなので、代わりに "Bob" という名前を取得します。Hello
本当にカスケード動作が必要であり、これが非常に危険で脆弱であることを理解している場合は、メソッドバインディングを使用してごまかすことができます。特定されていない目的のためにクラスに引数を追加したと仮定すると、バインディングは次のようになります。name
MyApp
Bind<IHello>().ToMethod(ctx =>
ctx.Kernel.Get<Hello>(ctx.Request.ParentContext.Parameters
.OfType<ConstructorArgument>()
.Where(c => c.Name == "name")
.First()));
お願いします、お願いします、それをする前に、これがあなたが望むものであるということを確信してください。簡単に見えますが、単純なリファクタリング中に壊れる可能性が非常に高く、私が見た「カスタマイズされた依存関係」シナリオの 95% は、WhenInjectedInto
代わりにバインディングを使用して対処できます。