2010-01-13 16 views
58

मैं Ninjectनिनजा मॉड्यूल का इरादा क्या है? कक्षाएं कि Ninject.Modules.Module से निकाले जाते हैं, और एक लोड विधि का सबसे शामिल है -

मैं अलग किसी और के कोड खींच रहा था और पाया Ninject मॉड्यूल के कई उदाहरण के लिए एक पूरा नौसिखिया हूँ उनका कोड

इन कक्षाओं को मानक कर्नेल के उदाहरण के लोड मॉड्यूल विधि का आह्वान करके और मॉड्यूल क्लास का एक उदाहरण पास करके बुलाया जाता है।

शायद मुझे यहां कुछ स्पष्ट याद आ रही है, लेकिन इसका एक सादा पुराना वर्ग बनाने और इसकी विधि को कॉल करने, या शायद स्थिर विधि के साथ एक स्थैतिक वर्ग बनाने का क्या फायदा है?

 

उत्तर

61

Ninject मॉड्यूल आईओसी कंटेनर के साथ विभिन्न प्रकार के रजिस्टर करने के लिए इस्तेमाल किया उपकरण हैं। लाभ यह है कि इन मॉड्यूल को तब अपनी कक्षाओं में रखा जाता है। यह आपको अपने मॉड्यूल में विभिन्न स्तरों/सेवाओं को रखने की अनुमति देता है।

// some method early in your app's life cycle 
public Kernel BuildKernel() 
{ 
    var modules = new INinjectModule[] 
    { 
     new LinqToSqlDataContextModule(), // just my L2S binding 
     new WebModule(), 
     new EventRegistrationModule() 
    }; 
    return new StandardKernel(modules); 
} 

// in LinqToSqlDataContextModule.cs 
public class LinqToSqlDataContextModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<IRepository>().To<LinqToSqlRepository>(); 
    } 
} 

एकाधिक मॉड्यूल होने से आपके आईओसी कंटेनर में भी चिंताओं को अलग करने की अनुमति मिलती है।

आप में से बाकी सवाल यह है कि यह आईओसी और डीआई के बारे में अधिक है, न कि केवल निनजेक। हां, आप आईओसी कंटेनर के बारे में सब कुछ करने के लिए स्थिर कॉन्फ़िगरेशन ऑब्जेक्ट्स का उपयोग कर सकते हैं। आईओसी कंटेनर वास्तव में अच्छा हो जाते हैं जब आपके पास निर्भरता के एकाधिक पदानुक्रम होते हैं।

public interface IInterfaceA {} 
public interface IInterfaceB {} 
public interface IInterfaceC {} 

public class ClassA : IInterfaceA {} 

public class ClassB : IInterfaceB 
{ 
    public ClassB(IInterfaceA a){} 
} 

public class ClassC : IInterfaceC 
{ 
    public ClassC(IInterfaceB b){} 
} 

बिल्डिंग क्लाससी इस बिंदु पर इंटरफेस की कई गहराई के साथ एक दर्द है। केवल कर्नेल से IInterfaceC के लिए पूछना बहुत आसान है।

var newc = ApplicationScope.Kernel.Get<IInterfaceC>(); 
+1

LinqToSqlDataContextModule मानक मॉड्यूल का विस्तार करना चाहिए? –

+1

@ मार्क गिबाद निनजेक्ट में नहीं 2. मानक मॉड्यूल चला गया है और निनजेक्टमुडूल के साथ प्रतिस्थापित किया गया है - http://github.com/enkari/ninject/tree/master/src/Ninject/Modules/ –

+1

यह एक अच्छा उदाहरण है, लेकिन टेस्टेबिलिटी के बारे में क्या? मैं लगातार सुनता हूं कि एक डीआई/आईओसी कंटेनर मुझे टेस्टेबिलिटी के साथ कैसे मदद कर सकता है, लेकिन मुझे एक वास्तविक उदाहरण खोजने में कठिनाई हो रही है जो दिखाएगा कि निनजेक्ट मेरे कोड को प्रदूषित नहीं करेगा और टेस्टेबिलिटी की सुविधा भी देगा। क्या कोई वास्तविक दुनिया ओपन सोर्स प्रोजेक्ट है जो मैं विचार पाने के लिए देख सकता हूं? –

9

हो सकता है कि मैं यहाँ स्पष्ट कुछ याद कर रहा हूँ, लेकिन क्या सिर्फ एक सादे पुराने वर्ग बनाने और एक स्थिर विधि के साथ अपने विधि, या शायद एक स्थिर वर्ग बुला पर इस के लाभ है ?

हां, आप बस मॉड्यूल के बिना बाइंडिंग सेट करने के लिए Bind<X>().To<Z>() कथन का एक गुच्छा कॉल कर सकते हैं।

  • IKernel.Load(IEnumerable<Assembly>) गतिशील प्रतिबिंब के माध्यम से इस तरह के मॉड्यूल का पता लगाने और उन्हें लोड कर सकते हैं:

    अंतर यह है कि यदि आप तो एक मॉड्यूल में इन बयानों डाल है।

  • बाइंडिंग को नाम के तहत तर्कसंगत रूप से समूहीकृत किया जाता है; आप IKernel.Unload(string)
3

शायद मैं यहाँ कुछ स्पष्ट याद कर रहा हूँ के साथ फिर से उन्हें अनलोड करने के लिए इस नाम का उपयोग कर सकते हैं, लेकिन सिर्फ एक सादे पुराने वर्ग शायद एक बनाने और उसके विधि बुला, या इस के लाभ क्या है स्थैतिक वर्ग एक स्थिर विधि के साथ?

हमारे लिए, यह बाद में बहुत आसानी से परीक्षण जोड़ने की क्षमता है। मॉकोबजेक्ट्स और वॉयला के साथ बस कुछ बाइंडिंग ओवरराइड करें .....एक डीआई के बिना विरासत कोड पर जो "सब कुछ" तारित करता है, बिना किसी पुनर्विक्रय के परीक्षण मामलों को सम्मिलित करना असंभव है। एक डीआई जगह के साथ और जब तक इसका उपयोग ठीक से किया गया था, जहां DI ने सबकुछ ऊपर उठाया था, तो ऐसा करना बहुत आसान है कि विरासत कोड पर भी बहुत बदसूरत हो।

कई डी ढांचे में, आप परीक्षण परीक्षण मॉड्यूल के साथ अपने परीक्षण के लिए उत्पादन मॉड्यूल का उपयोग कर सकते हैं जो मॉकोबजेक्ट्स के साथ विशिष्ट बाइंडिंग को ओवरराइड करता है (शेष तारों को छोड़कर)। ये यूनिट परीक्षणों से अधिक सिस्टम परीक्षण हो सकते हैं, लेकिन मैं औसत डेवलपर की तुलना में उच्च स्तरीय परीक्षण पसंद करता हूं क्योंकि यह कक्षाओं के बीच एकीकरण का परीक्षण करता है और यह परियोजना में शामिल होने वाले किसी व्यक्ति के लिए महान दस्तावेज़ीकरण है और पूरी सुविधा को क्रिया में देख सकता है (इसके बजाय सुविधा के कुछ हिस्सों में) पूरी प्रणाली स्थापित किए बिना)।