निर्भरता-इंजेक्शन फ्रेमवर्क के बाहर, निर्भरता इंजेक्शन (कंस्ट्रक्टर इंजेक्शन या सेटर इंजेक्शन के माध्यम से) लगभग एक शून्य-राशि का खेल है: आप ऑब्जेक्ट ए के बीच युग्मन को कम करते हैं और यह निर्भरता बी है, लेकिन अब किसी भी ऑब्जेक्ट को ए की आवृत्ति की आवश्यकता है ऑब्जेक्ट बी का निर्माण भी करते हैं।
आपने ए और बी के बीच युग्मन को थोड़ा कम किया है, लेकिन ए के इनकैप्सुलेशन को कम कर दिया है, और ए और किसी भी वर्ग के बीच युग्मन में वृद्धि की है जो ए की आवृत्ति का निर्माण करना चाहिए, उन्हें ए की निर्भरता के साथ युग्मित करके।
तो निर्भरता इंजेक्शन (एक ढांचे के बिना) उतना ही हानिकारक है जितना यह सहायक है।
अतिरिक्त लागत अक्सर आसानी से न्यायसंगत होती है, हालांकि: यदि क्लाइंट कोड को इस बात की अधिक जानकारी है कि ऑब्जेक्ट से निर्भरता का निर्माण कैसे किया जाता है, तो निर्भरता इंजेक्शन वास्तव में युग्मन को कम करता है; उदाहरण के लिए, स्कैनर को पार्स इनपुट से इनपुट इनपुट स्ट्रीम को प्राप्त करने या बनाने के तरीके के बारे में ज्यादा जानकारी नहीं है, या क्लाइंट कोड किस स्रोत से इनपुट पार्स करना चाहता है, इसलिए इनपुट स्ट्रीम का निर्माता इंजेक्शन स्पष्ट समाधान है।
नकली निर्भरता का उपयोग करने में सक्षम होने के लिए परीक्षण एक और औचित्य है। इसका मतलब यह होना चाहिए कि केवल परीक्षण के लिए उपयोग किए जाने वाले अतिरिक्त निर्माणकर्ता को जोड़ना, जो निर्भरता को इंजेक्ट करने की अनुमति देता है: यदि आप बदले में अपने निर्माणकर्ताओं को हमेशा इंजेक्ट करने के लिए निर्भरता की आवश्यकता होती है, तो अचानक, आपको अपनी निर्भरता के आधार पर अपनी निर्भरता की निर्भरता के बारे में जानना होगा। प्रत्यक्ष निर्भरता, और आप कोई भी काम नहीं कर सकते।
यह मददगार हो सकता है, लेकिन आपको प्रत्येक निर्भरता के लिए अपने आप से निश्चित रूप से पूछना चाहिए, क्या परीक्षण लाभ लागत के लायक है, और क्या मैं वास्तव में परीक्षण करते समय इस निर्भरता का मजाक बनाना चाहता हूं?
जब एक निर्भरता-इंजेक्शन ढांचा जोड़ा जाता है, और निर्भरता का निर्माण ग्राहक कोड के लिए नहीं बल्कि फ्रेमवर्क के बजाय दिया जाता है, तो लागत / लाभ विश्लेषण बहुत बदल जाता है।
एक निर्भरता-इंजेक्शन ढांचे में, ट्रेडऑफ़ थोड़ा अलग हैं; एक निर्भरता को इंजेक्ट करके आप जो खो रहे हैं, वह आसानी से यह जानने की क्षमता है कि आप किस कार्यान्वयन पर भरोसा कर रहे हैं, और यह तय करने की ज़िम्मेदारी को शिफ्ट करने के लिए कि आप किस तरह की स्वचालित रिज़ॉल्यूशन प्रक्रिया पर भरोसा कर रहे हैं (जैसे कि अगर हमें @ Inject'ed फू की आवश्यकता है वहाँ कुछ होना चाहिए जो @Provides फू, और जिनकी इंजेक्शन निर्भरताएं उपलब्ध हैं), या कुछ उच्च-स्तरीय कॉन्फ़िगरेशन फ़ाइल में, जो निर्धारित करता है कि प्रत्येक संसाधन के लिए क्या प्रदाता का उपयोग किया जाना चाहिए, या दोनों के कुछ हाइब्रिड के लिए (उदाहरण के लिए, हो सकता है) निर्भरता के लिए एक स्वचालित रिज़ॉल्यूशन प्रक्रिया हो सकती है, जिसे ज़रूरत पड़ने पर, कॉन्फ़िगरेशन फ़ाइल का उपयोग करके, ओवरराइड किया जा सकता है)।
जैसा कि कंस्ट्रक्टर इंजेक्शन में, मुझे लगता है कि ऐसा करने का फायदा खत्म हो जाता है, फिर से, ऐसा करने की लागत के समान होने के नाते: आपको यह जानने की जरूरत नहीं है कि आपके द्वारा भरोसा किए गए डेटा को कौन प्रदान कर रहा है, और, अगर कई संभावनाएं हैं प्रदाताओं, आपको प्रदाताओं के लिए जाँच करने के लिए पसंदीदा आदेश को जानने की ज़रूरत नहीं है, सुनिश्चित करें कि प्रत्येक स्थान जो सभी संभावित प्रदाताओं के लिए डेटा जांच की आवश्यकता है, आदि, क्योंकि यह सब निर्भरता इंजेक्शन द्वारा उच्च स्तर पर नियंत्रित किया जाता है। मंच।
जबकि मुझे व्यक्तिगत रूप से DI चौखटे के साथ बहुत अच्छा अनुभव नहीं है, मेरी धारणा यह है कि वे लागत से अधिक लाभ प्रदान करते हैं जब डेटा या सेवा के सही प्रदाता को खोजने का सिरदर्द होता है जिसकी आपको सिरदर्द से अधिक लागत होती है। जब कुछ विफल हो जाता है, तो तुरंत स्थानीय रूप से न जाने क्या कोड खराब डेटा प्रदान करता है जो आपके कोड में बाद में विफलता का कारण बनता है।
कुछ मामलों में, अन्य पैटर्न जो निर्भरता को अस्पष्ट करते हैं (उदाहरण के लिए सेवा लोकेटर) पहले से ही अपनाया गया था (और शायद यह भी उनके लायक साबित हुआ) जब डीआई फ्रेमवर्क दृश्य पर दिखाई दिए, और डीआई फ्रेमवर्क को अपनाया गया क्योंकि उन्होंने कुछ प्रतिस्पर्धी लाभ की पेशकश की, जैसे कि आवश्यकता होती है कम बॉयलरप्लेट कोड, या संभावित रूप से निर्भरता के प्रदाता को कम करने के लिए जब यह निर्धारित करना आवश्यक हो जाता है कि वास्तव में कौन सा प्रदाता उपयोग में है।