सख्ती से बोलना, निर्भरता इंजेक्शन केवल वास्तव में नहीं निर्भरता इंजेक्शन का विरोध करता है - और इसलिए किसी भी निर्भरता प्रबंधन रणनीति जो निर्भरता इंजेक्शन नहीं है ।
[अनवांटेड] युग्मन, हालांकि वास्तव में एक ऑर्थोगोनल मुद्दा नहीं है, या तो हो सकता है या किसी भी तरह से कम हो सकता है। ये दोनों युग्मित हैं DependencyClass
:
public DependencyInjectedConstructor(DependencyClass dep) {
dep.do();
}
public DependencyLookupConstructor() {
var dep = new DependencyClass();
dep.do();
}
DependencyLookupConstructor
DependencyClass
इस मामले में एक विशेष के लिए युग्मित है । लेकिन, वे दोनों के लिए युग्मित हैं DependencyClass
। असली बुराई, अगर यहां एक है, तो जरूरी नहीं कि कपलिंग हो, तो इसे DependencyLookupConstructor
बदलने की जरूरत है अगर DependencyClass
अचानक अपने स्वयं के आश्रितों को इंजेक्शन की आवश्यकता होती है 1 ।
हालाँकि, यह निर्माता / वर्ग और भी अधिक कपल है:
public DependencyLocatingConstructor() {
var dep = ServiceLocator.GetMyDoer();
dep.do();
}
आप सी # में काम कर रहे हैं, ऊपर अपनी अनुमति देगा ServiceLocator
वापस जाने के लिए कुछ भी जब GetMyDoer()
शुरू हो जाती है, यह है, जब तक कि यह कर सकते हैं do()
क्या DependencyLocatingConstructor
यह है do()
। कम्पाइल-टाइम हस्ताक्षर सत्यापन का लाभ आपको पूर्ण इंटरफ़ेस 2 के साथ जोड़े बिना भी मिलता है ।
तो, अपना जहर उठाओ।
लेकिन मूल रूप से, अगर डिपेंडेंसी इंजेक्शन का एक ठोस "विपरीत" है, तो यह "डिपेंडेंसी मैनेजमेंट स्ट्रैटेजीज़" के दायरे में कुछ और होगा। अन्य लोगों के बीच, यदि आपने बातचीत में निम्नलिखित में से किसी का उपयोग किया है, तो मैं इसे पहचान नहीं सकता कि डिपेंडेंसी इंजेक्शन नहीं है :
- सेवा लोकेटर पैटर्न
- निर्भरता लोकेटर / स्थान
- प्रत्यक्ष वस्तु / निर्भरता निर्माण
- छिपी हुई निर्भरता
- "निर्भरता इंजेक्शन नहीं"
1. विडंबना यह है कि उच्च स्तर पर DI हल करने वाली समस्याओं में से कुछ निम्न स्तर पर DI का उपयोग करते हुए [ओवर-] के परिणाम की तरह हैं। मुझे उन सभी जगहों पर मुट्ठी भर स्थानों को समायोजित करने के परिणामस्वरूप अनावश्यक जटिलता के साथ कोडबेस पर काम करने का आनंद मिला है, जहां उस जटिलता ने वास्तव में मदद की है ... मैं बुरी तरह से जोखिम में हूँ।
2. सेवा स्थान का उपयोग करने से भी आपको आसानी से एक ही प्रकार की विभिन्न निर्भरता को इनवॉइसिंग कोड से उनकी कार्यात्मक भूमिका द्वारा निर्दिष्ट करने की अनुमति मिलती है , जबकि अभी भी काफी हद तक अज्ञेय है कि कैसे निर्भरता का निर्माण किया जाता है। आपको इसका समाधान करना मान लीजिए User
या IUser
, उदाहरण के लिए: विभिन्न प्रयोजनों के लिए Locator.GetAdministrator()
बनाम Locator.GetAuthor()
या जो कुछ भी -। मेरा कोड यह पूछ सकता है कि कार्यात्मक रूप से इसकी आवश्यकता के बिना भी यह जानना चाहिए कि यह किस इंटरफेस का समर्थन करता है।