2012-11-06 14 views
13

DI क्या है और इसका उपयोग केस क्या है, जब हमारे पास ServiceManager है?ज़ेंड डि बनाम सेवा प्रबंधक निर्भरता इंजेक्शन कंटेनर

वे दोनों zend-di और zend-servicemanager हम इस तरह के aliases और invokables के रूप में कुछ विकल्प सेट कर सकते के लिए विन्यास फाइल में के बाद से समान दिखाई देते हैं।

मैं इन घटकों के साथ दृश्यों के पीछे क्या हो रहा है, इसकी बेहतर समझ प्राप्त करने की कोशिश कर रहा हूं, और दस्तावेज ने मुझे पर्याप्त जानकारी नहीं दी।

क्या आप कृपया मुझे बता सकते हैं कि अंतर क्या है और जब मुझे ServiceManager के बजाय उपयोग करना चाहिए?

+0

पर सामान्य रूप में कंटेनर के बारे में एक अच्छा विचार-विमर्श नहीं है http://www.php-fig.org/psr/psr-11/meta/ – Dennis

+0

आधुनिक सलाह "डी या एसएम का उपयोग न करें", जब तक वे पहले से ही आपके ढांचे का हिस्सा नहीं हैं। ज़ेंड फैक्ट्री-आधारित सेवा प्रबंधक (जो अनिवार्य रूप से प्रतिबंधित डी कंटेनर है) का उपयोग करता है, जहां आपको किसी भी कंटेनर को किसी भी कंटेनर में इंजेक्ट नहीं करना चाहिए, लेकिन आप अपने सेट अप के हिस्से के रूप में कंटेनर का उपयोग कर सकते हैं आवेदन। यानी ज़ेंड में आप अपनी निर्भरताओं को कैसे नियंत्रित कर सकते हैं अनुकूलित करने के लिए स्वयं ढांचे की सुविधाओं का उपयोग कर सकते हैं। कुछ हालिया उदाहरण यहां हैं: https://docs.zendframework.com/tutorials/getting-started/database-and-models/ – Dennis

उत्तर

15

ज़ेंड \ DI जादू पर निर्भर करता है, जैसे प्रतिबिंब, प्रतिबिंबों का पता लगाने और इंजेक्शन लगाने के लिए, जबकि सेवा प्रबंधक उपयोगकर्ता द्वारा प्रदान की गई कारखानों का उपयोग करता है। यह मुख्य अंतर है।

जटिलता, डिबगिंग और प्रदर्शन समस्याओं के कारण एसएम के पक्ष में समुदाय में बहिष्कृत डी प्रकार। यह आरएडी के लिए अच्छा होना चाहिए, लेकिन आपको इसे सही तरीके से उपयोग करने के लिए औसत ज्ञान से ऊपर की आवश्यकता है।

दूसरी ओर एसएम के पास सुंदर वर्बोज़ और स्पष्ट वायरिंग है, आप बाद में अपना कोड वर्ष खोल सकते हैं और आसानी से पता लगा सकते हैं कि क्या हो रहा है।

+1

यह एक अच्छा जवाब है, मुझे याद है कि DI प्रारंभिक रूप से उपयोग करना है और मैं इसका उपयोग करने के लिए वापस नहीं जाऊंगा । – DrBeza

+0

क्या इसका मतलब यह है कि मैं डी और एसएम का उपयोग करने से इंकार कर सकता हूं, काम भी करेगा? – user1650441

+0

ठीक उसी तरह जेरकस ने बताया। डि-स्टफ को बहुत अधिक माना जाता है, डी-कंटेनर बस अत्यधिक जटिल रहे हैं। ServiceManager एक ही कोर-समस्या को बहुत अधिक उपयोगकर्ता के अनुकूल तरीके से हल करता है। – Sam

6

Zend\Di आपकी कक्षाओं को एक साथ तारों का ख्याल रखने का ख्याल रखता है, जबकि Zend\ServiceManager के साथ आपको चीजों को मैन्युअल रूप से तार करना होगा और प्रत्येक कक्षा के लिए कारखाना बंद करना होगा जिसे आप तुरंत चालू करना चाहते हैं।

Zend\ServiceManager बहुत तेज़ है क्योंकि यह धीमी Reflection API पर निर्भर नहीं है। दूसरी ओर, सैकड़ों कक्षाओं के साथ बड़े अनुप्रयोगों के लिए लेखन बंद करना बहुत कठिन हो जाता है। अपने बंद होने को अद्यतित रखना आपके आवेदन के बढ़ने के साथ ही कठिन हो जाएगा।

इस समस्या को हल करने के लिए, मैंने ZendDiCompiler नामक एक ज़ेंड फ्रेमवर्क 2 मॉड्यूल लिखा है। यह आपके कोड को स्कैन करने के लिए Zend\Di पर निर्भर करता है और आपकी कक्षाओं को तुरंत चालू करने के लिए फैक्ट्री कोड को स्वतः उत्पन्न करता है। आपको दोनों घटकों का सर्वोत्तम लाभ मिलता है: Zend\Di की शक्ति और Zend\ServiceManager का प्रदर्शन।

मैंने ZendDiCompiler के दस्तावेज़ में काफी काम किया है और कुछ आसान और अधिक उन्नत उपयोग उदाहरण भी प्रदान किए जाते हैं।

0

असल में अंतर इस प्रकार है के रूप में:

  • Zend\ZerviceManager = फैक्टरी संचालित आईओसी कंटेनर
  • Zend\Di = Autowiring आईओसी कार्यान्वयन

Zend\Di संस्करण 3 के लिए पुनर्संशोधित किया गया इसका व्यवहार अब और अधिक ठोस और v2 से अनुमानित है और इसे ऑटो-वायरिंग क्षमताओं (कोई और अजीब जादू) प्रदान करने के लिए ज़ेन-सर्विसिकेंजर में निर्बाध रूप से एकीकृत करने के लिए डिज़ाइन किया गया है। चूंकि यह निर्भरताओं को हल करने के लिए PHP के प्रतिबिंब एपीआई का उपयोग करता है, यह फैक्ट्री संचालित दृष्टिकोण से धीमा है। इसलिए संस्करण 3 एक पूर्व-संकल्प इंजेक्टर बनाने के लिए एओटी कंपाइलर के साथ आता है जो प्रतिबिंब के उपयोग को छोड़ देता है। एक अतिरिक्त लाभ: उत्पन्न कारखानों का भी Zend\ServiceManager के साथ सीधे उपयोग किया जा सकता है।

दोनों घटकों के साथ AOT का उपयोग कर के लिए एक गाइड है: https://zendframework.github.io/zend-di/cookbook/aot-guide/

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