2012-06-27 155 views
5

考虑:Ninject和装饰

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中遗漏了某些东西。

回答

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))); 

希望帮助

注入的东西进入装饰你可以使用同样的伎俩,但解决的装饰