Dependency injection
सॉफ्टवेयर इंजीनियरिंग में, निर्भरता इंजेक्शन एक प्रोग्रामिंग तकनीक है जिसमें एक वस्तु या कार्य अन्य वस्तुओं या कार्यों को प्राप्त करता है जिनकी उसे आवश्यकता होती है, उन्हें आंतरिक रूप से बनाने के विपरीत। निर्भरता इंजेक्शन का उद्देश्य वस्तुओं के निर्माण और उनका उपयोग करने की चिंताओं को अलग करना है, जिससे शिथिल रूप से युग्मित कार्यक्रम होते हैं। पैटर्न यह सुनिश्चित करता है कि एक वस्तु या कार्य जो किसी दी गई सेवा का उपयोग करना चाहता है, उसे यह नहीं पता होना चाहिए कि उन सेवाओं का निर्माण कैसे किया जाए। इसके बजाय, प्राप्त करने वाले 'ग्राहक' (वस्तु या कार्य) को बाहरी कोड (एक 'इंजेक्टर') द्वारा अपनी निर्भरता प्रदान की जाती है, जिसके बारे में वह नहीं जानता है। निर्भरता इंजेक्शन अंतर्निहित निर्भरताओं को स्पष्ट बनाता है और निम्नलिखित समस्याओं को हल करने में मदद करता हैः एक वर्ग उन वस्तुओं के निर्माण से कैसे स्वतंत्र हो सकता है जिन पर वह निर्भर करता है? एक अनुप्रयोग और उसके द्वारा उपयोग की जाने वाली वस्तुएँ विभिन्न विन्यासों का समर्थन कैसे कर सकती हैं? कोड के एक टुकड़े के व्यवहार को सीधे संपादित किए बिना कैसे बदला जा सकता है? निर्भरता इंजेक्शन का उपयोग अक्सर निर्भरता व्युत्क्रम सिद्धांत के अनुरूप कोड रखने के लिए किया जाता है। स्टेटिकली-टाइप की गई भाषाओं में निर्भरता इंजेक्शन का उपयोग करने का मतलब है कि एक ग्राहक को अपने ठोस कार्यान्वयन के बजाय केवल उन सेवाओं के इंटरफेस की घोषणा करने की आवश्यकता होती है, जिससे यह बदलना आसान हो जाता है कि कौन सी सेवाओं का उपयोग पुनः संकलन किए बिना रनटाइम पर किया जाता है। अनुप्रयोग संरचना अक्सर निर्भरता इंजेक्शन को नियंत्रण के व्युत्क्रम के साथ जोड़ती है। नियंत्रण के व्युत्क्रम के तहत, ढांचा पहले एक वस्तु (जैसे एक नियंत्रक) का निर्माण करता है, फिर उस पर नियंत्रण प्रवाह पारित करता है। निर्भरता इंजेक्शन के साथ, ढांचा अनुप्रयोग वस्तु (अक्सर निर्माता विधि के मापदंडों में) द्वारा घोषित निर्भरताओं को भी तत्काल करता है, और निर्भरताओं को वस्तु में पारित करता है। निर्भरता इंजेक्शन "निर्भरताओं के कार्यान्वयन पर नियंत्रण को उलटने" के विचार को लागू करता है, यही कारण है कि कुछ जावा ढांचे सामान्य रूप से अवधारणा को "नियंत्रण का व्युत्क्रम" नाम देते हैं (नियंत्रण प्रवाह के व्युत्क्रम के साथ भ्रमित नहीं होना चाहिए)। भूमिका निर्भरता इंजेक्शन में चार भूमिकाएँ शामिल हैंः सेवाएँ, ग्राहक, इंटरफेस और इंजेक्टर। सेवाएँ और ग्राहक सेवा कोई भी वर्ग है जिसमें उपयोगी कार्यात्मकता होती है। बदले में, ग्राहक कोई भी वर्ग है जो सेवाओं का उपयोग करता है। ग्राहक को जिन सेवाओं की आवश्यकता होती है, वे ग्राहक की निर्भरता होती है। कोई भी वस्तु एक सेवा या ग्राहक हो सकती है; नाम केवल एक इंजेक्शन में वस्तुओं की भूमिका से संबंधित हैं। एक ही वस्तु एक ग्राहक (यह इंजेक्शन सेवाओं का उपयोग करता है) और एक सेवा (इसे अन्य वस्तुओं में इंजेक्शन दिया जाता है) दोनों भी हो सकती है। इंजेक्शन के बाद, सेवा को ग्राहक के राज्य का हिस्सा बनाया जाता है, जो उपयोग के लिए उपलब्ध होता है। इंटरफेस ग्राहकों को यह नहीं पता होना चाहिए कि उनकी निर्भरताओं को कैसे लागू किया जाता है, केवल उनके नाम और एपीआई। उदाहरण के लिए, एक सेवा जो ईमेल को पुनर्प्राप्त करती है, पर्दे के पीछे आई. एम. ए. पी. या पी. ओ. पी. 3 प्रोटोकॉल का उपयोग कर सकती है, लेकिन यह विवरण संभवतः कॉलिंग कोड के लिए अप्रासंगिक है जो केवल एक ईमेल को पुनर्प्राप्त करना चाहता है। कार्यान्वयन विवरणों को नजरअंदाज करने से, ग्राहकों को अपनी निर्भरताओं को बदलने की आवश्यकता नहीं होती है। इंजेक्टर इंजेक्टर, जिसे कभी-कभी असेंबलर, कंटेनर, प्रदाता या कारखाना भी कहा जाता है, ग्राहक को सेवाओं का परिचय देता है। इंजेक्टरों की भूमिका जटिल ऑब्जेक्ट ग्राफ का निर्माण और उन्हें जोड़ना है, जहां ऑब्जेक्ट क्लाइंट और सेवाएं दोनों हो सकते हैं। इन्जेक्टर अपने आप में एक साथ काम करने वाली कई वस्तुएँ हो सकती हैं, लेकिन ग्राहक नहीं होनी चाहिए, क्योंकि इससे एक गोलाकार निर्भरता पैदा होगी। क्योंकि निर्भरता इंजेक्शन अलग करता है कि वस्तुओं का निर्माण कैसे किया जाता है और उनका उपयोग कैसे किया जाता है, यह अक्सर अधिकांश वस्तु-उन्मुख भाषाओं में पाए जाने वाले नए मुख्य शब्द के महत्व को कम कर देता है। चूँकि ढांचा सेवाओं के निर्माण को संभालता है, प्रोग्रामर केवल सीधे मूल्य वस्तुओं का निर्माण करता है जो प्रोग्राम के डोमेन में संस्थाओं का प्रतिनिधित्व करते हैं (जैसे कि एक व्यावसायिक ऐप में एक कर्मचारी वस्तु या एक खरीदारी ऐप में एक ऑर्डर वस्तु)। सादृश्य एक सादृश्य के रूप में, कारों को ऐसी सेवाओं के रूप में सोचा जा सकता है जो लोगों को एक स्थान से दूसरे स्थान पर ले जाने का उपयोगी काम करती हैं। कार इंजन के लिए गैस, डीजल या बिजली की आवश्यकता हो सकती है, लेकिन यह विवरण ग्राहक के लिए महत्वहीन है-एक चालक-जो केवल इस बात की परवाह करता है कि क्या यह उन्हें उनके गंतव्य तक पहुँचा सकता है। कारें अपने पैडल, संचालन पहियों और अन्य नियंत्रणों के माध्यम से एक समान इंटरफेस प्रस्तुत करती हैं। इस प्रकार, फैक्ट्री लाइन पर उन्हें किस इंजन के साथ 'इंजेक्ट' किया गया था, यह मायने नहीं रखता है और चालक आवश्यकतानुसार किसी भी प्रकार की कार के बीच स्विच कर सकते हैं। लाभ और नुकसान निर्भरता इंजेक्शन का एक बुनियादी लाभ वर्गों और उनकी निर्भरताओं के बीच कम युग्मन है। ग्राहक के इस ज्ञान को हटाकर कि उसकी निर्भरताओं को कैसे लागू किया जाता है, कार्यक्रम अधिक पुनः प्रयोज्य, परीक्षण योग्य और बनाए रखने योग्य हो जाते हैं। इसके परिणामस्वरूप लचीलेपन में भी वृद्धि होती हैः एक ग्राहक किसी भी ऐसी चीज़ पर कार्य कर सकता है जो ग्राहक की अपेक्षा के आंतरिक इंटरफेस का समर्थन करती है। अधिक आम तौर पर, निर्भरता इंजेक्शन बॉयलरप्लेट कोड को कम कर देता है, क्योंकि सभी निर्भरता निर्माण एक एकल घटक द्वारा नियंत्रित किया जाता है। अंत में, निर्भरता इंजेक्शन समवर्ती विकास की अनुमति देता है। दो डेवलपर स्वतंत्र रूप से ऐसे वर्ग विकसित कर सकते हैं जो एक-दूसरे का उपयोग करते हैं, जबकि केवल उस इंटरफेस को जानने की आवश्यकता होती है जिसके माध्यम से वर्ग संवाद करेंगे। प्लगइन अक्सर तीसरे पक्ष द्वारा विकसित किए जाते हैं जो मूल उत्पाद के डेवलपर्स से कभी बात भी नहीं करते हैं। परीक्षण निर्भरता इंजेक्शन के कई लाभ विशेष रूप से इकाई-परीक्षण के लिए प्रासंगिक हैं। उदाहरण के लिए, निर्भरता इंजेक्शन का उपयोग किसी प्रणाली के विन्यास विवरण को विन्यास फ़ाइलों में बाहरी बनाने के लिए किया जा सकता है, जिससे प्रणाली को पुनर्संयोजन के बिना पुनर्संयोजित किया जा सकता है। अलग-अलग स्थितियों के लिए अलग विन्यास लिखे जा सकते हैं जिनके लिए घटकों के अलग-अलग कार्यान्वयन की आवश्यकता होती है। इसी तरह, क्योंकि निर्भरता इंजेक्शन को कोड व्यवहार में किसी भी बदलाव की आवश्यकता नहीं होती है, इसे रिफैक्टरिंग के रूप में विरासत कोड पर लागू किया जा सकता है। यह ग्राहकों को अधिक स्वतंत्र बनाता है और स्टब या नकली वस्तुओं का उपयोग करके अलगाव में इकाई परीक्षण करना आसान होता है, जो अन्य वस्तुओं का अनुकरण करते हैं जो परीक्षण के तहत नहीं हैं। परीक्षण की यह आसानी अक्सर निर्भरता इंजेक्शन का उपयोग करते समय देखा जाने वाला पहला लाभ है। निर्भरता इंजेक्शन के आलोचकों का तर्क है कि यह ऐसे ग्राहक बनाता है जो विन्यास विवरण की मांग करते हैं, जो स्पष्ट चूक उपलब्ध होने पर कठिन हो सकते हैं। कोड का पता लगाना मुश्किल बनाता है क्योंकि यह व्यवहार को निर्माण से अलग करता है। आमतौर पर प्रतिबिंब या गतिशील प्रोग्रामिंग के साथ लागू किया जाता है, जो आई. डी. ई. स्वचालन में बाधा डालता है। आमतौर पर अधिक अग्रिम विकास प्रयास की आवश्यकता होती है। एक रूपरेखा पर निर्भरता को प्रोत्साहित करता है। निर्भरता इंजेक्शन के प्रकार तीन मुख्य तरीके हैं जिनसे एक ग्राहक इंजेक्शन सेवाओं को प्राप्त कर सकता हैः निर्माता इंजेक्शन, जहां निर्भरता एक ग्राहक के वर्ग निर्माता के माध्यम से प्रदान की जाती है। सेटर इंजेक्शन, जहाँ ग्राहक एक सेटर विधि को उजागर करता है जो निर्भरता को स्वीकार करता है। इंटरफेस इंजेक्शन, जहाँ निर्भरता का इंटरफेस एक इंजेक्टर विधि प्रदान करता है जो उसे पारित किसी भी ग्राहक में निर्भरता को इंजेक्ट करेगा। कुछ ढांचे में, ग्राहकों को सक्रिय रूप से निर्भरता इंजेक्शन को स्वीकार करने की आवश्यकता नहीं होती है। उदाहरण के लिए, जावा में, प्रतिबिंब निजी विशेषताओं को सार्वजनिक कर सकता है जब परीक्षण और सीधे सेवाओं को इंजेक्ट किया जाता है। निर्भरता इंजेक्शन के बिना निम्नलिखित जावा उदाहरण में, क्लाइंट वर्ग में एक सेवा सदस्य चर होता है जिसे कंस्ट्रक्टर में आरंभ किया जाता है। ग्राहक सीधे निर्माण और नियंत्रण करता है कि वह किस सेवा का उपयोग करता है, जिससे एक हार्ड-कोडित निर्भरता पैदा होती है। सार्वजनिक वर्ग क्लाइंट {निजी सेवा सेवा; क्लाइंट () {// निर्भरता हार्ड-कोडित है। this.service = नया उदाहरण सेवा ();}} निर्माता इंजेक्शन निर्भरता इंजेक्शन का सबसे आम रूप एक वर्ग के लिए अपने निर्माता के माध्यम से अपनी निर्भरताओं का अनुरोध करना है। यह सुनिश्चित करता है कि ग्राहक हमेशा एक वैध स्थिति में है, क्योंकि इसे इसकी आवश्यक निर्भरताओं के बिना तत्काल नहीं किया जा सकता है। सार्वजनिक श्रेणी क्लाइंट {निजी सेवा सेवा;// निर्भरता को एक निर्माता के माध्यम से इंजेक्ट किया जाता है। ग्राहक (सेवा सेवा) {यदि (सेवा = = शून्य) {नया अवैध तर्क अपवाद फेंक दें ("सेवा शून्य नहीं होनी चाहिए");} this.service = सेवा;}} सेटर इंजेक्शन एक निर्माता के बजाय एक सेटर विधि के माध्यम से निर्भरताओं को स्वीकार करके, ग्राहक किसी भी समय इंजेक्टर को अपनी निर्भरताओं में हेरफेर करने की अनुमति दे सकते हैं। यह लचीलापन प्रदान करता है, लेकिन यह सुनिश्चित करना मुश्किल बनाता है कि ग्राहक का उपयोग करने से पहले सभी निर्भरताएं इंजेक्ट की गई हैं और मान्य हैं। सार्वजनिक श्रेणी क्लाइंट {निजी सेवा सेवा;// निर्भरता को एक सेटर विधि के माध्यम से इंजेक्ट किया जाता है। सार्वजनिक शून्य सेट सेवा (सेवा सेवा) {यदि (सेवा = = शून्य) {नया अवैध तर्क छोड़ें ("सेवा शून्य नहीं होनी चाहिए");} this.service = सेवा;}} इंटरफेस इंजेक्शन इंटरफेस इंजेक्शन के साथ, निर्भरताएँ अपने ग्राहकों के बारे में पूरी तरह से अनभिज्ञ हैं, फिर भी नए ग्राहकों को संदर्भ भेजती और प्राप्त करती हैं। इस तरह, निर्भरताएं इंजेक्टर बन जाती हैं। कुंजी यह है कि इंजेक्शन विधि एक इंटरफेस के माध्यम से प्रदान की जाती है। ग्राहक और उसकी निर्भरताओं को पेश करने के लिए अभी भी एक असेंबलर की आवश्यकता है। असेंबलर ग्राहक के लिए एक संदर्भ लेता है, इसे सेटर इंटरफेस पर डालता है जो उस निर्भरता को निर्धारित करता है, और इसे उस निर्भरता वस्तु को भेजता है जो बदले में ग्राहक को अपना संदर्भ वापस भेजता है। इंटरफेस इंजेक्शन का मूल्य होने के लिए, निर्भरता को केवल अपने लिए एक संदर्भ वापस करने के अलावा कुछ करना चाहिए। यह अन्य निर्भरताओं को हल करने के लिए एक कारखाने या उप-असेंबलर के रूप में कार्य कर सकता है, इस प्रकार मुख्य असेंबलर से कुछ विवरणों को अमूर्त कर सकता है। यह संदर्भ-गणना हो सकती है ताकि निर्भरता को पता चले कि कितने ग्राहक इसका उपयोग कर रहे हैं। यदि निर्भरता ग्राहकों के संग्रह को बनाए रखती है, तो यह बाद में उन सभी को अपने एक अलग उदाहरण के साथ इंजेक्ट कर सकती है। सार्वजनिक इंटरफेस सर्विससेटर {शून्य सेटसर्विस (सेवा सेवा);} सार्वजनिक वर्ग क्लाइंट सर्विससेटर को लागू करता है [निजी सेवा सेवा; @Override सार्वजनिक शून्य सेटसर्विस (सेवा सेवा)] {यदि (सेवा = शून्य) {नया अवैध तर्क अपवाद फेंक दें ("सेवा शून्य नहीं होनी चाहिए");} this.service = सेवा;} सार्वजनिक वर्ग सेवा इंजेक्टर {निजी अंतिम सेट <सर्विससेटर> क्लाइंट = नया हैशसेट <> (); सार्वजनिक शून्य इंजेक्ट (सर्विससेटर क्लाइंट) {this.clients.add (क्लाइंट); client.setService (नया उदाहरण सेवा ();} सार्वजनिक शून्य स्विच () सार्वजनिक वर्ग कार्यक्रम {सार्वजनिक स्थैतिक शून्य मुख्य (स्ट्रिंग [] आरजीएस) {// सेवा का निर्माण करें। सेवा सेवा = नया उदाहरण सेवा ();// ग्राहक को सेवा प्रदान करें। ग्राहक ग्राहक = नया ग्राहक (सेवा);// वस्तुओं का उपयोग करें। System.out.println (client.greet ();} मैन्युअल निर्माण अधिक जटिल हो सकता है और इसमें बिल्डर, कारखाने या अन्य निर्माण पैटर्न शामिल हो सकते हैं। फ्रेमवर्क मैनुअल डिपेंडेंसी इंजेक्शन अक्सर बड़ी परियोजनाओं के लिए थकाऊ और त्रुटि-प्रवण होता है, जो प्रक्रिया को स्वचालित करने वाले फ्रेमवर्क के उपयोग को बढ़ावा देता है। मैन्युअल निर्भरता इंजेक्शन एक निर्भरता इंजेक्शन ढांचा बन जाता है जब निर्माण कोड अब अनुप्रयोग के लिए अनुकूलित नहीं होता है और इसके बजाय सार्वभौमिक होता है। उपयोगी होने के बावजूद, इन उपकरणों को निर्भरता इंजेक्शन करने की आवश्यकता नहीं है। कुछ फ्रेमवर्क, जैसे स्प्रिंग, प्रोग्राम संरचना की योजना बनाने के लिए बाहरी कॉन्फ़िगरेशन फ़ाइलों का उपयोग कर सकते हैंः आयात org.springframework.beans.factory.BeanFactory; आयात org.springframework.context.ApplicationContext; आयात org.springframework.context.support.ClassPathXmlApplicationContext; सार्वजनिक वर्ग इंजेक्टर {सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग) {// किस ठोस सेवा का उपयोग करने के बारे में विवरण प्रोग्राम से अलग कॉन्फ़िगरेशन में संग्रहीत किए जाते हैं। बीनफैक्टरी बीनफैक्टरी = नया क्लासपाथएक्सएमएल एप्लिकेशन कॉन्टेक्स्ट ("Beans.xml"); क्लाइंट क्लाइंट = (क्लाइंट) beanfactory.getBean ("क्लाइंट"); System.out.println (client.greet ();}} संभावित रूप से लंबे और जटिल ऑब्जेक्ट ग्राफ के साथ भी, कोड में उल्लिखित एकमात्र वर्ग प्रवेश बिंदु है, इस मामले में Client.Client में स्प्रिंग के साथ काम करने के लिए कोई बदलाव नहीं हुआ है और यह एक पोजो बना हुआ है। स्प्रिंग-विशिष्ट एनोटेशन और कॉल को कई वर्गों के बीच फैलने से रोककर, सिस्टम केवल स्प्रिंग पर निर्भर रहता है। उदाहरण एंगुलरजेएस निम्नलिखित उदाहरण एक एंगुलरजेएस घटक को दिखाता है जो निर्भरता इंजेक्शन के माध्यम से अभिवादन सेवा प्राप्त करता है। फ़ंक्शन समक्लास (ग्रीटर) {this.greeter = ग्रीटर;} SomeClass.prototype.doSomething = फ़ंक्शन (नाम) {this.greeter.greet (नाम);} प्रत्येक एंगुलरजेएस अनुप्रयोग में एक सेवा लोकेटर होता है जो निर्भरताओं के निर्माण और खोज के लिए जिम्मेदार होता है। //एक मॉड्यूल वार मायमॉड्यूल = angular.module ('मायमॉड्यूल', []) में तारों की जानकारी प्रदान करें;// इंजेक्टर को ग्रीटर सेवा का निर्माण करना सिखाएं। //स्वागतकर्ता $विंडो सेवा पर निर्भर है। myModule.factory ('ग्रीटर', फंक्शन ($विंडो) {रिटर्न {ग्रीटः फंक्शन (टेक्स्ट) {$window.alert (टेक्स्ट);}};}); फिर हम एक नया इंजेक्टर बना सकते हैं जो ग्रीटर सेवा सहित मायमॉड्यूल मॉड्यूल में परिभाषित घटक प्रदान करता है। वार इंजेक्टर = angular.injector (['मायमॉड्यूल', 'ng']); वार ग्रीटर = injector.get ('ग्रीटर'); सर्विस लोकेटर एंटीपेटर्न से बचने के लिए, एंगुलरजेएस एचटीएमएल टेम्प्लेट में घोषणात्मक संकेतन की अनुमति देता है जो इंजेक्टर को घटक बनाने का प्रतिनिधित्व करता है। <डिवी एनजी-नियंत्रक = "माईकंट्रोलर"> <बटन एनजी-क्लिक = "सेहेलो ()"> हैलो </बटन> </डिवी> फंक्शन माईकंट्रोलर ($स्कोप, ग्रीटर) {$scope.sayHello = फंक्शन () {greeter.greet ('हैलो वर्ल्ड');};} एनजी-नियंत्रक निर्देश नियंत्रक और उसकी निर्भरताओं का एक उदाहरण बनाने के लिए इंजेक्टर को ट्रिगर करता है। सी #यह नमूना सी #में कंस्ट्रक्टर इंजेक्शन का एक उदाहरण प्रदान करता है। सिस्टम का उपयोग करना; नेमस्पेस डिपेंडेंसी इंजेक्शन;// हमारे ग्राहक को केवल इस इंटरफेस के बारे में पता होगा, न कि वह किस विशिष्ट गेमपैड का उपयोग कर रहा है। इंटरफेस आईगैमपैड फंक्शनलिटी {स्ट्रिंग गेटगैमपैडनेम (); शून्य सेटवाइब्रेशन पावर (फ्लोट पावर);}// निम्नलिखित सेवाएँ उपरोक्त इंटरफेस के ठोस कार्यान्वयन प्रदान करती हैं। क्लास एक्सबॉक्स गेमपैडः आईगैमपैड फंक्शनलिटी {फ्लोट वाइब्रेशन पावर = 1. f; पब्लिक स्ट्रिंग गेटगैमपैड नेम () => "एक्सबॉक्स कंट्रोलर"; पब्लिक वॉइड सेटवाइब्रेशन पावर (फ्लोट पावर) => this.vibrationPower = Math.Clamp (पावर, 0.0f, 1. f);} क्लास प्लेस्टेशन जॉयस्टिकः आईगैमपैड फंक्शनलिटी {फ्लोट वाइब्रेशन पावर = 100.0f; पब्लिक स्ट्रिंग गेटगैमपैड नेम () => "प्लेस्टेशन कंट्रोलर"; पब्लिक वॉइड सेटवाइब्रेशन पावर (फ्लोट पावर) => this.vibratingPower = Math.Clamp (पावर * 100.0f, 0.0f, 100.0f) क्लास गेमपैड {आईगैमपैड फंक्शनलिटी गेमपैड फंक्शनलिटी;// सर्विस को कंस्ट्रक्टर के माध्यम से इंजेक्ट किया जाता है और उपरोक्त क्षेत्र में संग्रहीत किया जाता है। सार्वजनिक गेमपैड (आई. जी. एम. पी. डी. कार्यात्मकता गेमपैड कार्यात्मकता) => this.gamepadFunctionality = गेमपैड कार्यात्मकता; सार्वजनिक शून्य शोकेस () {// इंजेक्शन सेवा का उपयोग किया जाता है। वार गेमपैड नाम = this.gamepadFunctionality.GetGamepadName (); वार संदेश = $"हम अभी {गेमपैड नाम} का उपयोग कर रहे हैं, क्या आप कंपन शक्ति को बदलना चाहते हैं? "; Console.WriteLine (संदेश);}} वर्ग कार्यक्रम {स्थिर शून्य मुख्य () {वार स्टीम कंट्रोलर = नया स्टीम कंट्रोलर ();// हम एक एक्सबॉक्स कंट्रोलर, प्लेस्टेशन जॉयस्टिक, आदि में भी उत्तीर्ण हो सकते थे। //गेमपैड को पता नहीं है कि वह क्या उपयोग कर रहा है और इसकी आवश्यकता नहीं है। वार गेमपैड = नया गेमपैड (स्टीमकंट्रोलर); gamepad.Showcase ();} वास्तुकला विवरण भाषा भी देखें नियंत्रण प्लग-इन का फैक्टरी पैटर्न व्युत्क्रम (कंप्यूटिंग) रणनीति पैटर्न एंगुलरजेएस सर्विस लोकेटर पैटर्न पैरामीटर (कंप्यूटर प्रोग्रामिंग) क्वाजेक्ट संदर्भ बाहरी लिंक मार्क सीमन द्वारा रचना मूल निर्भरता इंजेक्शन निर्भरता और परीक्षण योग्य वस्तुओं के लिए एक शुरुआती गाइडः शिथिल रूप से युग्मित और परीक्षण योग्य वस्तुओं को डिजाइन करना-जेरेमी वेस्कोटेन; डॉ. डॉब्स जर्नल, मई 2006। डिजाइन पैटर्नः निर्भरता इंजेक्शन-एमएसडीएन पत्रिका, सितंबर 2005 मार्टिन फाउलर का मूल लेख जिसने ईएए के निर्भरता इंजेक्शन पी शब्द की शुरुआत कीः निर्भरता इंजेक्शन के पीछे समृद्ध इंजीनियरिंग विरासत-एंड्रयू मैकवी-निर्भरता इंजेक्शन का एक विस्तृत इतिहास। निर्भरता इंजेक्शन क्या है? - एक वैकल्पिक व्याख्या-जैकब जेनकोव राइटिंग मोर टेस्टेबल कोड विद डिपेंडेंसी इंजेक्शन-- Developer.com, अक्टूबर 2006 मैनेज्ड एक्सटेंसिबिलिटी फ्रेमवर्क ओवरव्यू-- एमएसडीएन हंट द्वारा डिपेंडेंसी मैकेनिज्म का पुराने जमाने का विवरण 1998 रिफैक्टर योर वे टू ए डिपेंडेंसी इंजेक्शन कंटेनर पी. एच. पी. में डी. आई. को समझना आपको डिपेंडेंसी इंजेक्शन कंटेनर घटक-आधारित सॉफ्टवेयर इंजीनियरिंग सॉफ्टवेयर आर्किटेक्चर सॉफ्टवेयर डिजाइन पैटर्न की आवश्यकता नहीं है उदाहरण के लिए जावा कोड वाले लेख