2012-06-27 28 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."); 
    } 
} 

मैं डेकोरेटर और कार्यान्वयन के सभी कैसे बाध्य कर सकते हैं जैसे कि जब मैं कर्नेल को कॉल करता हूं। GETAll मुझे ट्रेसिंग सजावट के 3 उदाहरण मिलते हैं, प्रत्येक एक अलग आंतरिक बैच प्रक्रिया के साथ?

मुझे निनजेक इंटरसेप्शन के बारे में पता है और विभिन्न कारणों से इसके लिए प्रॉक्सी आधारित समाधानों का उपयोग नहीं करना चाहते हैं। फिलहाल ऐसा लगता है कि मुझे आईबैचप्रोसेस उदाहरणों के लिए सक्रियण रणनीति के साथ खेलने की जरूरत है जैसे कि वे हल हो गए हैं और फिर मैं उन्हें सजाने और वापस कर सकता हूं लेकिन मुझे उम्मीद है कि मैंने बाध्यकारी एपीआई में कुछ याद किया है।

उत्तर

3

यदि आपको सजावट में निर्भरता इंजेक्षन करने की आवश्यकता नहीं है तो आपकी समस्या का एक बहुत ही सरल समाधान है। बस ऑनएक्टिवेशन बाइंडिंग विधियों का उपयोग करें। यही कारण है कि जैसे

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))); 

आशा है कि

में मदद करता है के द्वारा सामान सुई आप एक ही चाल का उपयोग कर सकते हैं, लेकिन हल डेकोरेटर की जरूरत है होगा
संबंधित मुद्दे