2012-06-27 13 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) => 
         ctx.Kernel.Get<BatchProcessDecorator>(new ConstructorArgument("process", process))); 

希望によりデコレータを使用すると、同じトリックを使用することができますデコレータにものを注入が、解決する必要がある場合はそれは

Bind<IBatchProcess>().To<ConcreteBatchProcess>() 
        .OnActivation((ctx, process) => 
         new BatchProcessDecorator(process)); 

ようになります。