5

क्या उनके बीच कोई अंतर है और कुंजी से सरणी में ऑब्जेक्ट प्राप्त करने के बजाय कोई अंतर है?रजिस्ट्री पैटर्न बनाम सेवा लोकेटर पैटर्न बनाम निर्भरता इंजेक्शन कंटेनर

class Registry 
{ 
private $container=array(); 
    public static function Set($name,$object){ 
    self::$container[$name]=$object; 
    } 
    public static function &Get($name){ 
    return self::$container[$name]; 
    } 
} 

उत्तर

16

रजिस्ट्री पैटर्न

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

डि कंटेनर/डि पैटर्न

एक डि कंटेनर एक रजिस्ट्री जो वस्तु प्रकारको कपोल-कल्पना की मैपिंग है शामिल हैं। यह उस समय अधिक उन्नत है जब किसी ऑब्जेक्ट को हल किया जाता है, यह तत्काल होता है, और इसलिए ऑब्जेक्ट की सभी निर्भरता हैं।

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

निर्भरता इंजेक्शन पैटर्न है कि doesn't necessarily use a DI container। डी पैटर्न में composition root शामिल है जो एप्लिकेशन के प्रवेश बिंदु पर बैठता है। संरचना जड़ है जहां प्रकार पंजीकृत हैं और जहां रूट ऑब्जेक्ट ग्राफ़ तत्काल है। एक बार रूट ऑब्जेक्ट को तुरंत चालू कर दिया जाता है, तो एप्लिकेशन स्वयं ही चलता है। एप्लिकेशन में डीआई कंटेनर का कोई संदर्भ नहीं है और यह कसकर इसके साथ नहीं है।

सेवा लोकेटर

सेवा लोकेटर कई लोगों द्वारा माना जाता anti-pattern माना जाता है। विचार यह है कि आप या तो अपने ऑब्जेक्ट में कंटेनर इंजेक्ट करते हैं या रनटाइम पर उदाहरण बनाने के लिए डी कंटेनर के स्थिर संदर्भ का उपयोग करते हैं।

प्राथमिक अंतर यह है कि आवेदन स्पष्ट रूप से (इस प्रकार को कसकर युग्मित) डि कंटेनर पर निर्भर है।

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

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

संबंधित मुद्दे