सेवा लोकेटर कहने के लिए सिर्फ दो बुराइयों का कम है। "कम" इन चार अंतरों के लिए उबल रहा है ( कम से कम मैं अभी किसी अन्य के बारे में नहीं सोच सकता )
एकल जिम्मेदारी सिद्धांत
सर्विस कंटेनर एकल जिम्मेदारी सिद्धांत का उल्लंघन नहीं करता है, जैसे सिंगलटन करता है। सिंगलटन ऑब्जेक्ट निर्माण और व्यावसायिक तर्क को मिलाते हैं, जबकि सेवा कंटेनर आपके एप्लिकेशन के ऑब्जेक्ट जीवन चक्रों के प्रबंधन के लिए सख्ती से जिम्मेदार है। उस संबंध में सेवा कंटेनर बेहतर है।
युग्मन
स्टैटिक मेथड कॉल्स की वजह से सिंगलटन आपके एप्लिकेशन में आमतौर पर हार्डकोडेड होते हैं, जो आपके कोड में निर्भरता को बढ़ाने के लिए कड़ा युग्मित और कठिन होता है । दूसरी ओर SL सिर्फ एक वर्ग है और इसे इंजेक्ट किया जा सकता है। तो जबकि आपके सभी वर्गीकृत इस पर निर्भर होंगे, कम से कम यह एक कपल पर निर्भरता है। इसलिए जब तक आपने सर्विसलॉकर को सिंगलटन के रूप में लागू नहीं किया, यह कुछ हद तक बेहतर है और परीक्षण के लिए भी आसान है।
हालाँकि, ServiceLocator का उपयोग करने वाले सभी वर्ग अब ServiceLocator पर निर्भर होंगे, जो युग्मन का एक रूप भी है। यह ServiceLocator के लिए एक इंटरफ़ेस का उपयोग करके कम किया जा सकता है ताकि आप एक ठोस ServiceLocator कार्यान्वयन के लिए बाध्य न हों, लेकिन आपकी कक्षाएं किसी प्रकार के लोकेटर के अस्तित्व पर निर्भर करेंगी जबकि नाटकीय रूप से बढ़े हुए ServiceLocator का उपयोग न करें।
छिपी हुई निर्भरता
निर्भरता छिपाने की समस्या बहुत आगे मौजूद है, हालांकि। जब आप बस अपने उपभोगकर्ता वर्गों को लोकेटर इंजेक्ट करते हैं, तो आप किसी भी निर्भरता को नहीं जान पाएंगे। लेकिन सिंगलटन के विपरीत, एसएल आमतौर पर पर्दे के पीछे आवश्यक सभी निर्भरता को तुरंत हटा देगा। इसलिए जब आप एक सेवा प्राप्त करते हैं, तो आप क्रेडिटकार्ड उदाहरण में मिसको हेवेरी की तरह समाप्त नहीं होते हैं , उदाहरण के लिए , आपको निर्भरता की सभी अवसादों को हाथ से रोकना नहीं है।
उदाहरण के अंदर से निर्भरता लाना कानून के उल्लंघनकर्ता का भी उल्लंघन है , जिसमें कहा गया है कि आपको सहयोगियों में खुदाई नहीं करनी चाहिए। एक उदाहरण केवल अपने तत्काल सहयोगियों से बात करना चाहिए। यह सिंगलटन और सर्विसलॉकर दोनों के साथ एक समस्या है।
ग्लोबल स्टेट
ग्लोबल स्टेट की समस्या भी कुछ हद तक कम हो जाती है क्योंकि जब आप परीक्षणों के बीच एक नए सर्विस लोकेटर को तुरंत तैयार करते हैं तो पहले से निर्मित सभी उदाहरणों को भी हटा दिया जाता है (जब तक कि आपने गलती नहीं की है और उन्हें एसएल में स्थिर विशेषताओं में सहेजा है)। यह SL द्वारा प्रबंधित कक्षाओं में किसी भी वैश्विक राज्य के लिए सही नहीं है, ज़ाहिर है।
बहुत अधिक चर्चा के लिए सेवा लोकेटर बनाम निर्भरता इंजेक्शन पर फाउलर भी देखें ।
आपके अपडेट पर एक नोट और सेबस्टियन बर्गमैन द्वारा सिंगलेट्सन का उपयोग करने वाले परीक्षण कोड पर लिंक किए गए लेख : सेबस्टियन किसी भी तरह से, सुझाव नहीं देता है कि प्रस्तावित वर्कअराउंड एकल समस्या का कम उपयोग करता है। यह कोड बनाने का सिर्फ एक तरीका है कि अन्यथा अधिक परीक्षण योग्य परीक्षण करना असंभव होगा। लेकिन यह अभी भी समस्याग्रस्त कोड है। वास्तव में, वह स्पष्ट रूप से नोट करता है: "सिर्फ इसलिए कि आप कर सकते हैं, इसका मतलब यह नहीं है कि आपको चाहिए"।