2010-01-03 15 views
46

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

धन्यवाद!

उत्तर

69

जैसा कि आप पहले से ही पता लगा चुके हैं, निर्भरता इंजेक्शन (डीआई) केवल पैटर्न और तकनीकों का संग्रह है।

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

बिंदु यह है कि आपके आवेदन में केवल एक ही जगह है जहां एक विशेष तकनीक (आपके डी कंटेनर) के लिए एक मजबूत संदर्भ है। एप्लिकेशन के बाकी का आनंदपूर्वक अनजान कैसे वस्तु ग्राफ ऊपर तार किया गया है - यह सब मायने रखती है कि सभी आवश्यक निर्भरता सही ढंग से इंजेक्शन थे (और आप गारंटी नहीं है कि यह इतना है अशक्त गार्ड साथ निर्माता इंजेक्शन उपयोग कर सकते हैं)।

सार फैक्टरी पैटर्न एक बहुत उपयोगी पैटर्न जब यह डि की बात आती है। संक्षेप में, सार फैक्ट्री का उपयोग करें जब:

  • आपको एक निर्भरता को हल करने से पहले केवल एक बार या अधिक पैरामीटर को चलाने की आवश्यकता है।
  • निर्भरता का जीवनकाल उपभोक्ता के जीवनकाल से अवधारणात्मक रूप से छोटा है।

उदाहरण और अधिक जानकारी यहां उपलब्ध है:

+1

मुझे लगता है कि मैं लगभग वहां हूं। मेरे साथ यहाँ रहें :) चलो बस कहना है कि मेरे पास आईफ्रूट इंटरफ़ेस है जिसे क्लास ऐप्पल द्वारा कार्यान्वित किया गया है। इस ठोस प्रकार को पंजीकृत करने के बाद, मैं इसे विंडोज़ फॉर्म में अपने बटन क्लिक ईवेंट में उपयोग करना चाहता हूं। बटन ईवेंट से स्पष्ट रूप से आईओसी कंटेनर तक पहुंचने के बिना मैं कक्षा ऐप्पल कैसे प्राप्त करूं? –

+7

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

+0

केवल एक IFruit उदाहरण को ध्यान में रखते हुए, बटन क्लिक ईवेंट के साथ फॉर्म क्लास में इंजेक्शन देने का एकमात्र तरीका यह है कि अगर मैं आईफ्रूट इंटरफेस को शामिल करने के लिए फॉर्म कंस्ट्रक्टर बदलता हूं और फिर फॉर्म को स्वयं आईओसी कंटेनर के साथ कन्स्ट्रक्टर करने के लिए पंजीकृत करता हूं इंजेक्शन। क्या यह सही है? मदद करने के लिए धन्यवाद! –

4

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

लेकिन यह केवल बहुत कम वस्तुओं के साथ होना चाहिए और आपके बूटस्ट्रैप/फैक्टरी वर्ग के उपयोगकर्ता को यथासंभव अंतर्निहित वास्तुकला के बारे में पता होना चाहिए। उदाहरण के लिए यदि आपने आईओसी के माध्यम से पूरी तरह से एक HTTP सर्वर ऑब्जेक्ट कॉन्फ़िगर किया है और आप इसे बूट करना चाहते हैं तो अपने बूटस्ट्रैप क्लास को केवल getHttpServer() विधि प्रदान करने की आवश्यकता है। फिर आपके प्रोग्राम मुख्य विधि को केवल बूटस्ट्रैप.getHttpServer() को कॉल करने की आवश्यकता है। इसे चालू करने के लिए प्रारंभ करें।

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

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