2012-06-27 129 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))); 

希望幫助

注入的東西進入裝飾你可以使用同樣的伎倆,但解決的裝飾