वास्तव में, "सही" तरीका एक कारखाने का उपयोग तब तक नहीं करना है जब तक कि कोई अन्य विकल्प न हो (जैसा कि इकाई परीक्षण और कुछ नकली - उत्पादन कोड के लिए आप कारखाने का उपयोग नहीं करते हैं)! ऐसा करना वास्तव में एक प्रतिमान है और इसे हर कीमत पर टाला जाना चाहिए। DI कंटेनर के पीछे का पूरा बिंदु गैजेट को आपके लिए काम करने की अनुमति देता है ।
जैसा कि एक पूर्व पोस्ट में ऊपर कहा गया था, आप चाहते हैं कि आपका आईओसी गैजेट आपके ऐप में विभिन्न आश्रित वस्तुओं के निर्माण के लिए जिम्मेदारी ग्रहण करे। इसका मतलब है कि अपने DI गैजेट को विभिन्न उदाहरणों को स्वयं बनाने और प्रबंधित करने दें। DI के पीछे यह पूरा बिंदु है - आपकी वस्तुओं को पता होना चाहिए कि वे उन वस्तुओं को कैसे बनाते और / या प्रबंधित करते हैं जिन पर वे निर्भर हैं। अन्यथा करने के लिए ढीली युग्मन को तोड़ता है।
एक मौजूदा एप्लिकेशन को सभी DI में बदलना एक बहुत बड़ा कदम है, लेकिन ऐसा करने में स्पष्ट कठिनाइयों को अलग करते हुए, आप यह भी चाहेंगे कि (DI जीवन को थोड़ा आसान बनाने के लिए) DI टूल का पता लगाने के लिए जो आपके बाइंडिंग के थोक को स्वचालित रूप से प्रदर्शित करेगा। (निनॉज़ जैसी चीज़ का मूल वह "kernel.Bind<someInterface>().To<someConcreteClass>()"
कॉल है जो आप अपने इंटरफ़ेस घोषणाओं को उन ठोस वर्गों से मेल खाने के लिए बनाते हैं जिन्हें आप उन इंटरफेस को लागू करने के लिए उपयोग करना चाहते हैं। यह "बिंद" कॉल हैं जो आपके DI गैजेट को आपके कंस्ट्रक्टर कॉल को इंटरसेप्ट करने और प्रदान करने की अनुमति देते हैं। आवश्यक निर्भर वस्तु उदाहरण। कुछ वर्ग के लिए एक विशिष्ट कंस्ट्रक्टर (छद्म कोड यहां दिखाया गया है) हो सकता है:
public class SomeClass
{
private ISomeClassA _ClassA;
private ISomeOtherClassB _ClassB;
public SomeClass(ISomeClassA aInstanceOfA, ISomeOtherClassB aInstanceOfB)
{
if (aInstanceOfA == null)
throw new NullArgumentException();
if (aInstanceOfB == null)
throw new NullArgumentException();
_ClassA = aInstanceOfA;
_ClassB = aInstanceOfB;
}
public void DoSomething()
{
_ClassA.PerformSomeAction();
_ClassB.PerformSomeOtherActionUsingTheInstanceOfClassA(_ClassA);
}
}
ध्यान दें कि कहीं नहीं उस कोड में भी कोई कोड नहीं बनाया गया था जो /ConcreteClassA या SomeOtherConcreteClassB के उदाहरण को बनाया / प्रबंधित / जारी किया था। वास्तव में, न तो ठोस वर्ग को संदर्भित किया गया था। तो ... जादू कहाँ हुआ?
आपके ऐप के स्टार्ट अप हिस्से में, निम्नलिखित हुआ (फिर से, यह छद्म कोड है लेकिन यह वास्तविक (Ninject) चीज़ के बहुत करीब है ...):
public void StartUp()
{
kernel.Bind<ISomeClassA>().To<SomeConcreteClassA>();
kernel.Bind<ISomeOtherClassB>().To<SomeOtherConcreteClassB>();
}
कोड का वह छोटा सा हिस्सा निनॉज़ गैजेट को कंस्ट्रक्टरों की तलाश करने, उन्हें स्कैन करने, उन इंटरफेस के उदाहरणों को देखने के लिए कहता है जिन्हें इसे संभालने के लिए कॉन्फ़िगर किया गया है (जो कि "बाइंड" कॉल है) और फिर कंक्रीट क्लास का एक उदाहरण बनाएं और स्थानापन्न करें उदाहरण संदर्भित है।
एक अच्छा उपकरण है जो Ninject को बहुत अच्छी तरह से Ninject.Extensions.Conventions (अभी तक एक और NuGet पैकेज) कहा जाता है जो आपके लिए इस काम का थोक काम करेगा। सीखने के उत्कृष्ट अनुभव से दूर नहीं जाने के रूप में आप इसे स्वयं बना लेंगे, लेकिन स्वयं को आरंभ करने के लिए, यह जांच का एक उपकरण हो सकता है।
यदि स्मृति कार्य करती है, तो यूनिटी (औपचारिक रूप से Microsoft अब एक ओपन सोर्स प्रोजेक्ट है) के पास एक विधि कॉल या दो है जो समान कार्य करते हैं, अन्य उपकरणों में समान सहायक होते हैं।
आप जो भी रास्ता चुनते हैं, निश्चित रूप से अपने डि ट्रेनिंग के थोक के लिए मार्क सीमन की पुस्तक पढ़ें, हालांकि, यह ध्यान दिया जाना चाहिए कि सॉफ्टवेयर इंजीनियरिंग की दुनिया के "ग्रेट ओन्स" (जैसे मार्क) भी गलतियां कर सकते हैं - मार्क सभी के बारे में भूल गए अपनी पुस्तक में Ninject इसलिए यहाँ केवल Ninject के लिए लिखा गया एक और संसाधन है। मेरे पास यह है और इसका एक अच्छा पढ़ा: डिपेंडेंसी इंजेक्शन के लिए मास्टेरिंग निनजेक्ट