निर्भरता इंजेक्शन बनाम सेवा लोकेटर

Unsplash पर जॉन कार्लिसल द्वारा फोटो

कई डेवलपर्स बाहर निर्भरता इंजेक्शन और सेवा लोकेटर डिजाइन पैटर्न के बीच अंतर नहीं देखते हैं। हां, दोनों एक ही समस्या को हल करने की कोशिश कर रहे हैं - डिकॉउलिंग में वृद्धि। हम सभी जानते हैं कि स्केलिंग, टेस्टिंग या कोड को पढ़ने पर यह हमें क्या लाभ देता है।

हालांकि, मुझे कैसे पता चलेगा कि निर्भरता इंजेक्शन का उपयोग कब करना है और सेवा लोकेटर का उपयोग कब करना है? मैं कहूंगा कि उपयुक्त होने पर हम दोनों का उपयोग करें।

अगर मुझे किसी एक क्रिया को चुनने के लिए कहा गया, जो निर्भरता इंजेक्शन पैटर्न का वर्णन करता है जिसे मैं "देने के लिए" चुनूंगा। यदि आप इसके बारे में सोचते हैं, तो ठीक यही हम सब के बाद निर्भरता इंजेक्शन के साथ प्राप्त करते हैं। हम बस किसी वस्तु को वस्तु देते हैं।

$ खिड़की = नई खिड़की ();
$ दरवाजा = नया दरवाजा ();
$ घर = नया घर ($ खिड़की, $ दरवाजा);

इस मामले में, हम विंडो ऑब्जेक्ट और हाउस ऑब्जेक्ट को डोर ऑब्जेक्ट देते हैं।

दूसरी ओर, यदि मुझे एक क्रिया के साथ सेवा लोकेटर पैटर्न का वर्णन करने के लिए कहा गया था, तो मैं कहूंगा कि "लेना"। बस इसके बारे में सोचो। सेवा लोकेटर का उपयोग करते समय हम यही करते हैं। हम ऑब्जेक्ट से ऑब्जेक्ट लेते हैं।

$ घर = $ सर्विसलॉकर-> मिलता है (घर :: वर्ग);

जैसा कि आप देख सकते हैं, हम सेवा लोकेटर से घर की वस्तु लेते हैं।

कई मामलों में, निर्भरता इंजेक्शन और सेवा लोकेटर एक इकाई के रूप में काम करते हैं। हम यह नहीं देख सकते हैं जब चीजें स्वचालित रूप से इंजेक्ट की जाती हैं, लेकिन दृश्य के पीछे निर्भरता इंजेक्शन के कार्यान्वयन वास्तविक निर्भरता को पुनः प्राप्त करने के लिए सेवा लोकेटरों पर भरोसा करते हैं।

यह इस तरह से कोड में कहीं दिख सकता है:

foreach ($ निर्भरता के रूप में $ निर्भरता) {
    $ उदाहरण [] = $ यह-> कंटेनर-> मिलता है ($ निर्भरता);
}
$ यह लौटें-> संकल्प ($ वर्ग, $ उदाहरण);

एक सेवा लोकेटर को लागू करने के लिए बहुत आसान है। आप सभी की जरूरत है नाम या आईडी द्वारा अनुरोधित आवृत्ति प्राप्त करने की क्षमता है और यह जांचने की क्षमता है कि क्या वास्तव में अनुरोधित उदाहरण मौजूद है। ध्यान दें कि सेवा लोकेटर को अक्सर कंटेनर कहा जाता है। दोनों बातें समान हैं। यह दोनों उदाहरण या सेवाएं प्रदान करने के लिए हैं, हालांकि आप उन्हें कॉल करना पसंद करते हैं। बेशक, सेवा और उदाहरण के बीच एक अंतर होता है जब शब्दों और उद्देश्यों के बारे में बोलते हैं, लेकिन तकनीकी दृष्टिकोण से वे सभी कुछ वर्गों के उदाहरण हैं।

यहाँ एक सेवा लोकेटर (उर्फ कंटेनर) का एक आदिम संस्करण है:

वर्ग सेवाधारी {

    निजी $ सेवाएं = [];

    सार्वजनिक समारोह मिलता है (स्ट्रिंग $ आईडी): वस्तु? {
        $ यह लौटाएँ-> सेवाएं [$ id] ?? शून्य;
    }


    सार्वजनिक समारोह में (स्ट्रिंग $ आईडी): बूल {
        वापसी ($ यह-> सेवाएं [$ आईडी]) है;
    }

    सार्वजनिक समारोह रजिस्टर (स्ट्रिंग $ आईडी, वस्तु $ सेवा): शून्य {
        $ यह-> सेवाएं [$ id] = $ सेवा;
    }
}
$ सर्विसलॉकर = नया सेवायोजक ();
$ सर्विसलॉकर-> रजिस्टर ('घर', नया सदन ());
// कहीं और

अगर ($ सर्विसलॉटर-> के पास ('घर')) {
    $ घर = $ सर्विसलॉकर-> मिलता है ('घर');
}

इसके अतिरिक्त, मैंने सेवाओं को पंजीकृत करने का तरीका प्रदान किया है।

निर्भरता इंजेक्शन के कार्यान्वयन आमतौर पर वस्तुओं में निर्भरता को स्वचालित रूप से इंजेक्ट करते हैं। आप सभी की जरूरत है विन्यास और कि सभी प्रदान करने के लिए है। यह कई मामलों में बहुत सुविधाजनक है, लेकिन ऐसे मामले हैं जब आपको गतिरोध से बचने के लिए सेवा लोकेटर का उपयोग करना पड़ता है। यह तब हो सकता है जब दो उदाहरणों को कंस्ट्रक्टर के माध्यम से एक-दूसरे पर निर्भर किया जाता है। यहाँ एक उदाहरण है:

कक्षा {
    
    सार्वजनिक समारोह __construct (B $ b)
    {
        //
    }
}

कक्षा बी {
    सार्वजनिक समारोह __construct (A $ a)
    {
        //
    }
}
$ a = नया A (...); // हमें B की आवश्यकता है!
$ बी = नया बी (...); // हमे जरूरत है!

जैसा कि आप देख सकते हैं, हम किसी भी सेवा को हल नहीं कर सकते क्योंकि वे एक दूसरे पर निर्भर हैं। हम सेवा A को हल नहीं कर सकते क्योंकि इसके लिए सेवा B की आवश्यकता है, और हम सेवा B का समाधान नहीं कर सकते क्योंकि इसे सेवा A की आवश्यकता है। इसे हल करने के लिए, हमें आलसी-लोडिंग तरीके से सेवाओं में से एक को पुनः प्राप्त करने की आवश्यकता है। मतलब यह है कि, हमें सेवा लोकेटर में से एक उस बिंदु पर लेना चाहिए जब सेवा वास्तव में जरूरत है और निर्माणकर्ता में नहीं है।

सब मिलाकर

आशा है कि इस लेख ने आपके लिए कुछ चीजों को मंजूरी दी और आपको इसे पढ़ने में मज़ा आया। यदि नहीं, तो आप पहले से ही वहाँ प्रोग्रामर होशियार होना चाहिए ;-)