2012-06-27 30 views
5

Given:Ninject và trang trí

public interface IBatchProcess 
{ 
    void Run(); 
} 

và nhiều thi hành:

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

và trang trí tracing:

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

Làm thế nào tôi có thể ràng buộc trang trí và tất cả các hiện thực như vậy khi tôi gọi kernel.GetAll tôi nhận được 3 trường hợp của trang trí theo dõi, mỗi với một quá trình lô bên trong khác nhau?

Tôi biết về Khử từ Ninject và không muốn sử dụng các giải pháp dựa trên proxy vì lý do khác nhau này. Tại thời điểm này có vẻ như tôi cần phải chơi xung quanh với chiến lược kích hoạt cho các cá thể IBatchProcess như vậy mà chúng được giải quyết và sau đó tôi có thể trang trí và trả lại chúng nhưng tôi hy vọng tôi đã bỏ sót một thứ gì đó trong api ràng buộc.

Trả lời

3

Nếu bạn không cần phải tiêm phụ thuộc vào trang trí thì có một giải pháp rất đơn giản cho vấn đề của bạn. Đơn giản chỉ cần sử dụng các phương pháp ràng buộc OnActivation. Điều đó sẽ trông giống như

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

Nếu bạn cần phải tiêm thứ vào trang trí, bạn có thể sử dụng các thủ thuật tương tự nhưng giải quyết trang trí bởi

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

Hy vọng rằng sẽ giúp