コンテキスト内のParameters.ConstructorArgument
は、デフォルトで1レベルだけ深くなります。
パラメータを複数のレベルに渡す1つの方法は、ContextParameterを使用することですが、それを取得して言う必要があります。この場合は、これをConstructorArgumentとして使用します。そのような構成の1つがプロバイダーです。プロバイダーの詳細については、この道場のページを参照してください
だからあなたはすることができます:
class DependencyProvider : SimpleProvider<Dependency>
{
protected override Dependency CreateInstance( IContext context )
{
return new Dependency( (int)context.ParentContext.Parameters.GetOne<ContextVariableParameter>( "masterVal" ).Value );
}
}
public static void Main()
{
var module = new InlineModule(
mod => mod.Bind<IDependency>().ToProvider( new DependencyProvider() )
);
var kernel = new StandardKernel( new[ ] {module} );
Root root = kernel.Get<Root>( With.Parameters.ContextVariable( "masterVal", 12 ) );
}
または、次のように管理できます。
class RootProvider : SimpleProvider<Root>
{
protected override Root CreateInstance( IContext context )
{
return new Root( context.Kernel.Get<Dependency>( With.Parameters.ConstructorArgument("val", ( int )context.Parameters.GetOne<ContextVariableParameter>("masterVal").Value )));
}
}
public static void Main()
{
var module = new InlineModule(
mod => mod.Bind<IDependency>().To<Dependency>(), // Optional if ImplictSelfBinding is on
mod => mod.Bind<Root>().ToProvider( new RootProvider() )
);
var kernel = new StandardKernel( new[] {module} );
Root root = kernel.Get<Root>( With.Parameters.ContextVariable( "masterVal", 12 ) );
}
これについて考えている間、この点で私が指摘する点を考慮して、この応答で構成をオブジェクトバインディングから行う場合の懸念を再分離してください。