默认情况下Parameters.ConstructorArgument
,上下文仅深一层。
将参数向下传递多个级别的一种方法是使用 ContextParameter,但随后需要抓住它并说 - 现在我们将在这种情况下将其用作 ConstructorArgument。一种这样的构造是提供者。有关提供者的详细信息,请参阅此 dojo 页面
所以你可以这样做:
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 ) );
}
当您考虑这一点时,请考虑我在这一点中提出的观点,即在此响应中将关注点与配置与对象绑定分开。