वर्ग स्तर पर, यह आसान है।
'डिपेंडेंसी इंजेक्शन' बस इस सवाल का जवाब देता है कि "मैं अपने सहयोगियों को कैसे ढूंढूंगा" के साथ "वे आपको धक्का देते हैं - आपको खुद जाने और उन्हें पाने की ज़रूरत नहीं है"। (यह समान है - लेकिन समान नहीं है - 'उलटा नियंत्रण' जहां सवाल "मैं अपने इनपुट पर अपना ऑर्डर कैसे करूंगा?" का एक समान उत्तर है)।
केवल लाभ यह है कि अपने सहयोगियों होने आप पर धक्का दे दिया है कि एक वस्तु ग्राफ जो सूट अपने वर्तमान की जरूरत रचना के लिए अपने वर्ग का उपयोग करने के लिए ग्राहक कोड के लिए सक्षम बनाता है ... आप मनमाने ढंग से नहीं किया है निजी तौर पर निर्णय लेने से से आकार और ग्राफ की अस्थिरता पूर्व निर्धारित आपके सहयोगियों के ठोस प्रकार और जीवन-चक्र।
(सभी अन्य लाभ, टेस्टीबिलिटी के, ढीले कपलिंग के, आदि, बड़े पैमाने पर इंटरफेस के उपयोग से पालन करते हैं और निर्भरता-इंजेक्शन-नेस से बहुत अधिक नहीं हैं, हालांकि डीआई स्वाभाविक रूप से इंटरफेस के उपयोग को बढ़ावा देता है)।
यह ध्यान देने योग्य है कि, अगर आप अपने खुद के सहयोगियों instantiating से बचने के है, तो अपने वर्ग चाहिए लायक है इसलिए (यह दूसरा विकल्प अक्सर अनदेखी की है जिस तरह से अपने सहयोगियों एक निर्माता, एक संपत्ति है, या एक विधि-तर्क से मिलता है ... यह करता है हमेशा एक वर्ग 'सहयोगियों के लिए अपनी' राज्य 'का हिस्सा बनने के लिए कोई मतलब नहीं)।
और यह एक अच्छी बात है।
आवेदन स्तर पर ...
चीजों के प्रति-वर्गीय दृष्टिकोण के लिए बहुत कुछ। मान लें कि आपके पास कक्षाओं का एक समूह है, जो "अपने स्वयं के सहयोगियों को तत्काल न करें" नियम का पालन करते हैं, और उनसे एक आवेदन करना चाहते हैं। सबसे आसान काम यह है कि आप जिस वस्तु का ग्राफ चाहते हैं, उसकी रचना करें और उस पर कुछ इनपुट फेंकें, अच्छे पुराने कोड का उपयोग करें । (हां, आपके ग्राफ़ की कुछ वस्तुएं स्वयं ऑब्जेक्ट-फ़ैक्टरी होंगी, जो ग्राफ़ में अन्य लंबे समय तक जीवित ऑब्जेक्ट्स के सहयोगी के रूप में पारित हो चुकी हैं, सेवा के लिए तैयार हैं ... आप प्रत्येक ऑब्जेक्ट को पूर्व-निर्माण नहीं कर सकते हैं! )।
... आपके 'लचीलेपन' को आपके ऐप के ऑब्जेक्ट-ग्राफ़ को कॉन्फ़िगर करने की आवश्यकता है ...
अपने अन्य (गैर-कोड-संबंधित) उद्देश्यों के आधार पर, आप एंड-यूज़र को इस तरह तैनात ऑब्जेक्ट ग्राफ़ पर कुछ नियंत्रण देना चाह सकते हैं। यह आपको विन्यास योजना की दिशा में ले जाता है, एक प्रकार या किसी अन्य की, चाहे वह किसी नाम / मूल्य जोड़े के साथ अपने स्वयं के डिजाइन की एक पाठ फ़ाइल हो, एक XML फ़ाइल, एक कस्टम डीएसएल, एक घोषणात्मक ग्राफ़-विवरण भाषा जैसे YAML, एक अनिवार्य स्क्रिप्टिंग भाषा जैसे जावास्क्रिप्ट, या हाथ में कार्य के लिए उपयुक्त कुछ और। एक वैध वस्तु ग्राफ की रचना करने के लिए जो कुछ भी होता है, वह एक तरह से जो आपके उपयोगकर्ताओं की जरूरतों को पूरा करता है।
... एक महत्वपूर्ण डिजाइन बल हो सकता है।
उस प्रकार की सबसे चरम परिस्थिति में, आप एक बहुत ही सामान्य दृष्टिकोण अपनाने के लिए चुनाव कर सकते हैं, और अंतिम उपयोगकर्ताओं को उनके चयन के ऑब्जेक्ट-ग्राफ को 'वायरिंग' करने के लिए एक सामान्य तंत्र दे सकते हैं और यहां तक कि उन्हें इंटरफेस के ठोस अहसास प्रदान करने की अनुमति भी दे सकते हैं । क्रम! (आपका दस्तावेज़ीकरण एक शानदार गहना है, आपके उपयोगकर्ता बहुत स्मार्ट हैं, कम से कम आपके एप्लिकेशन के ऑब्जेक्ट ग्राफ़ की मोटे रूपरेखा से परिचित हैं, लेकिन एक संकलक काम करने के लिए ऐसा नहीं होता है)। यह परिदृश्य सैद्धांतिक रूप से कुछ 'उद्यम' स्थितियों में हो सकता है।
उस स्थिति में, आपके पास संभवतः एक घोषणात्मक भाषा होती है जो आपके उपयोगकर्ताओं को किसी भी प्रकार को व्यक्त करने की अनुमति देती है, इस प्रकार के ऑब्जेक्ट ग्राफ की संरचना, और इंटरफेस का एक पैलेट जो पौराणिक अंत-उपयोगकर्ता मिश्रण और मेल कर सकता है। अपने उपयोगकर्ताओं पर संज्ञानात्मक भार को कम करने के लिए, आप 'कन्वेंशन द्वारा कॉन्फ़िगरेशन' दृष्टिकोण पसंद करते हैं, ताकि उन्हें पूरी चीज़ के साथ कुश्ती के बजाय केवल ऑब्जेक्ट-ग्राफ़-फ़्रेग-इन-स्टेप और ओवर-राइड करना पड़े।
आप बेचारे सोद!
चूँकि आपने वह सब लिखने की कल्पना नहीं की, जो आप (लेकिन गंभीरता से, अपनी भाषा के लिए एक बंधन बाँधने की जाँच करें), आप किसी तरह के DI ढांचे का उपयोग कर रहे हैं।
उस ढांचे की परिपक्वता के आधार पर, आपके पास कंस्ट्रक्टर-इंजेक्शन का उपयोग करने का विकल्प नहीं हो सकता है, भले ही यह समझ में आता हो (सहयोगी किसी वस्तु के जीवनकाल में नहीं बदलता है), जिससे आपको सेटर इंजेक्शन का उपयोग करने के लिए मजबूर किया जाता है (तब भी जब सहयोगी किसी वस्तु के जीवनकाल में नहीं बदलते हैं, और तब भी जब वास्तव में एक तार्किक कारण नहीं है कि एक इंटरफ़ेस के सभी ठोस कार्यान्वयन के लिए एक विशिष्ट प्रकार के सहयोगी क्यों होने चाहिए )। यदि ऐसा है, तो आप वर्तमान में अपने कोड-बेस - हॉरर के दौरान पूरी तरह से 'उपयोग किए गए इंटरफेस' होने के बावजूद, मजबूत-युग्मन नरक में हैं!
उम्मीद है कि हालांकि, आपने एक डीआई फ्रेमवर्क का उपयोग किया है जो आपको कंस्ट्रक्टर इंजेक्शन का विकल्प देता है, और आपके उपयोगकर्ता केवल उन चीजों के बारे में सोचने के लिए अधिक समय नहीं दे रहे हैं जो उन्हें कॉन्फ़िगर करने और उन्हें कार्य के लिए अधिक अनुकूल यूआई देने के लिए आवश्यक विशिष्ट चीजों के बारे में सोचते हैं। उपलब्ध। (हालांकि निष्पक्ष होने के लिए, आपने शायद एक तरह से सोचने की कोशिश की थी, लेकिन JavaEE ने आपको निराश कर दिया और आपको इस भयानक हैक का सहारा लेना पड़ा)।
Bootnote
किसी भी बिंदु पर आप कभी भी Google Guice का उपयोग नहीं कर रहे हैं, जो आपको कोड लिखने के साथ कोड-ऑब्जेक्ट ... को लिखने के कार्य के साथ कोडन करने का एक तरीका देता है । अरे!