5

鉴于:

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 Interception 并且出于各种原因不想使用基于代理的解决方案。目前,我似乎需要使用 IBatchProcess 实例的激活策略,以便解决它们,然后我可以装饰并返回它们,但我希望我只是错过了绑定 api 中的某些内容。

4

1 回答 1

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

希望有帮助

于 2012-06-28T04:28:53.550 回答