निर्भरता इंजेक्शन और सिंगलटन। क्या वे दो पूरी तरह से अलग अवधारणाएं हैं?


17

मैं अपने सहयोगी के लिए सिंगलटन पर निर्भरता इंजेक्शन का उपयोग करने के बारे में सुन रहा हूं। मैं अभी भी यह नहीं बता सकता कि क्या वे दो ऑर्थोगोनल पैटर्न हैं जिन्हें एक दूसरे से बदला जा सकता है? या डीआई, सिंगलटन पैटर्न को परीक्षण योग्य बनाने की एक विधि है?

कृपया निम्नलिखित कोड स्निपेट पर एक नज़र डालें।

    IMathFace obj = Singleton.Instance;

    SingletonConsumer singConsumer = new SingletonConsumer(obj);

    singConsumer.ConsumerAdd(10,20);

SingletonConsumerप्रकार का एक पैरामीटर स्वीकार कर रहा है IMathFace। आंतरिक रूप से सिंगलटन वर्ग तक पहुंचने के बजाय, SingletonConsumerकॉलर द्वारा सिंग्लटन का उदाहरण दिया जाएगा। क्या यह निर्भरता इंजेक्शन के माध्यम से सिंगलटन वर्ग की खपत का एक अच्छा उदाहरण है?


क्या आप मुझे बता सकते हैं कि DI सिंगलटन की जगह कैसे ले सकता है?

7
सिंगलटन एक डिज़ाइन पैटर्न है। DI / IoC एक तकनीक है।
डेव

2
DI सिंग्लटन को किसी केले से ज्यादा कार्बोरेटर की जगह नहीं दे सकता। वे पूरी तरह से अलग अवधारणाएं हैं।
डेव

इसलिए मेरा उदाहरण मान्य है।

1
हां, लेकिन यह एनकैप्सुलेशन (गैर-सिंगलटन के लिए भी सच है) की कीमत पर आ सकता है: देखें: stackoverflow.com/questions/1005473/…

जवाबों:


17

मुझे लगता है कि उनका मतलब था कि आपको एक स्थिर एक्सेसर के साथ शास्त्रीय सिंगलटन कार्यान्वयन का उपयोग करने के बजाय, सेवा के एक भी उदाहरण को इंजेक्ट करने के लिए निर्भरता इंजेक्शन का उपयोग करना चाहिए MySingleton.Instance

public class MySingleton
{
    public static MySingleton Instance{get{...}};
}

शास्त्रीय सिंगलटन कार्यान्वयन के साथ आपका सारा कोड उस सेवा पर निर्भर करता है जो एक सिंगलटन है। जब भी आप उपयोग करते हैं तो आप मूल रूप से उस कोड को हार्डकोड करते हैं MySingleton.Instance

दूसरी तरफ DI के साथ आपको अपने कंस्ट्रक्टर में उत्तीर्ण सेवा का एक उदाहरण मिलता है, और इसे स्टोर करते हैं। यह है कि इस सेवा का केवल एक ही उदाहरण है एक कार्यान्वयन विवरण। उपभोग कोड को एक अलग उदाहरण देने के लिए आप इसे आसानी से बदल सकते हैं। इस तरह से आपके पास कुछ वर्ग / इंटरफ़ेस है जो एक ही उदाहरण द्वारा लागू होने के बजाय होता है कि केवल एक ही उदाहरण है।

यह उपयोगी है अगर आप उदाहरण के लिए परीक्षण के लिए सेवा का एक नकली कार्यान्वयन चाहते हैं, या यदि कार्यक्रम के विभिन्न हिस्सों को उस सेवा के विभिन्न कॉन्फ़िगरेशन की आवश्यकता होती है।


4

हाँ आप सही है। एकल के माध्यम से ऑब्जेक्ट तक पहुंचने के बजाय, आप इसके लिए एक संदर्भ दे रहे हैं, इस प्रकार आप एक कंस्ट्रक्टर इंजेक्शन का उपयोग कर रहे हैं।

दूसरों का कहना है कि ये धारणाएं संबंधित नहीं हैं। एक एकल उदाहरण का उपभोग करना कुछ खास नहीं है क्योंकि आप जिस वस्तु को इंजेक्ट कर रहे हैं वह वास्तव में परवाह नहीं करता है कि इंजेक्शन वस्तु कहां से आती है।


3

एक मामला है जहाँ सिंगलटन पैटर्न और DI / IoC प्रतिच्छेद- एक सिंगलटन का इंजेक्शन।

अधिकांश DI चौखटे को एक इंजेक्ट किए गए ऑब्जेक्ट के एक भी उदाहरण को तुरंत कॉन्फ़िगर करने के लिए कॉन्फ़िगर किया जा सकता है। कोई भी उपभोक्ता वस्तु जो इस तरह की वस्तु का अनुरोध करती है, उसे एक ही उदाहरण मिलेगा। यह उदाहरण एक सिंगलटन की परिभाषा के अनुसार है। यह अवधारणा में ओवरलैप के लिए इसके बारे में है।


2

यहाँ भ्रम यह है कि दो अवधारणाओं को मिला दिया गया है: सिंगलटन और स्थिर एक्सेसर / गेटवे से सिंगलटन उदाहरण।

जैसा कि आपने सही पहचान की है, आपका सहकर्मी सुझाव दे रहा है कि निर्भरता को सीधे उपयोग करने के बजाय इंजेक्ट किया जाए Singleton.Instance(स्टेटिक गेटवे)।

इसका कारण यह है कि सिंगलटन पैटर्न के साथ इसका वास्तव में कोई लेना-देना नहीं है, यह है कि एक ही DI अवधारणा के साथ एक गैर-एकल वस्तु को तात्कालिक करने के लिए समान रूप से लागू होता है new Foo()। यह निर्भर करता है कि क्या यह एक एकल कार्यान्वयन है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.