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 に答える