假设:
public interface IBatchProcess
{
void Run();
}
和多个实现:
public class BatchProcessOne : IBatchProcess { ... }
public class BatchProcessTwo : IBatchProcess { ... }
public class BatchProcessThree : IBatchProcess { ... }
和追踪装饰者:
public class BatchProcessTraceDecorator : IBatchProcess
{
private readonly IBatchProcess _inner;
public BatchProcessTraceDecorator( IBatchProcess inner )
{
_inner = inner;
}
public void Run()
{
Trace.TraceInformation( "Starting batch process..." );
_inner.Run();
Trace.TraceInformation( "Batch process complete." );
}
}
如何绑定装饰器和所有实现,这样当我调用kernel.GetAll时,我得到3个跟踪装饰器实例,每个实例都有不同的内部批处理过程?
我知道Ninject拦截,并且由于各种原因不希望使用基于代理的解决方案。目前看起来我需要使用IBatchProcess实例的激活策略,以便它们被解析,然后我可以装饰并返回它们,但我希望我只是错过了绑定api中的内容。
答案 0 :(得分:3)
如果您不需要将依赖项注入装饰器,那么您的问题就有一个非常简单的解决方案。只需使用OnActivation绑定方法即可。那看起来像是
Bind<IBatchProcess>().To<ConcreteBatchProcess>()
.OnActivation((ctx, process) =>
new BatchProcessDecorator(process));
如果你需要将东西注入装饰器,你可以使用相同的技巧,但通过
解析装饰器Bind<IBatchProcess>().To<ConcreteBatchProcess>()
.OnActivation((ctx, process) =>
ctx.Kernel.Get<BatchProcessDecorator>(new ConstructorArgument("process", process)));
希望有所帮助