2012-06-27 10 views
5

Verilen: aitNinject ve Dekoratörler

public interface IBatchProcess 
{ 
    void Run(); 
} 

ve çoklu uygulama:

public class BatchProcessOne : IBatchProcess { ... } 
public class BatchProcessTwo : IBatchProcess { ... } 
public class BatchProcessThree : IBatchProcess { ... } 

ve izleme dekoratör:

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."); 
    } 
} 

nasıl dekoratör ve uygulamaların tüm bağlayabilir kernel.GetAll olarak adlandırdığımda, her biri farklı bir iç yığın işlemiyle izleme dekoratörünün 3 örneğini alıyorum.

Ninject Interception hakkında bilgi sahibiyim ve çeşitli nedenlerle bunun için proxy tabanlı çözümler kullanmak istemiyorum. Şu anda çözülecek IBatchProcess örnekleri için aktivasyon stratejisiyle uğraşmam gerekiyor gibi görünüyor ve daha sonra onları dekore edip iade edebiliyorum ama umuyorum ki basitçe bağlayıcı api içinde bir şeyleri kaçırdım.

cevap

3

Bağımlılıkları dekoratöre enjekte etmeniz gerekmiyorsa, sorununuz için çok basit bir çözüm var. OnActivation bağlama yöntemlerini kullanın. Eğer

yardımcı

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

Hope'un dekoratör Eğer aynı kolaylıktan dekoratör içine şeyler enjekte ama çözmek için gerekirse Yani

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

gibi görünecektir