DI / IoC कंटेनर बनाम कारखाने: मैं अपने आवेदन कहां और क्यों कॉन्फ़िगर करूं?


9

मैं यह जानने की कोशिश कर रहा हूं कि मेरे सॉफ़्टवेयर को कॉन्फ़िगर करने के लिए डीआईसी / IoC रजिस्ट्री का उपयोग कब करना है और कारखानों का उपयोग करने के लिए, या तो दृष्टिकोण के पीछे तर्क के साथ।


मैं अपने DI कंटेनर (डीआईसी) के रूप में स्ट्रक्च्योर मैप का उपयोग कर रहा हूं, जो रजिस्ट्रियों का उपयोग करके कॉन्फ़िगर करना आसान है। डीआईसी में व्यावहारिक रूप से सभी पंजीकृत वस्तुएं इस अर्थ में स्थिर हैं, कि मुझे डीआईसी को कॉन्फ़िगर करने के बाद रनटाइम में किसी भी कार्यान्वयन / उदाहरण को बदलने / एक्सचेंज करने की आवश्यकता नहीं है, और वे डीआईसी में एकल के रूप में कॉन्फ़िगर किए गए हैं। हालाँकि, चूंकि मेरा सॉफ़्टवेयर (SW) विभिन्न उपकरणों पर चलेगा, मुझे डिवाइस के आधार पर डिवाइस-विशिष्ट रजिस्ट्री का चयन करने की आवश्यकता है जो कि मेरे SW के अनुसार हार्डवेयर को कॉन्फ़िगर करने के लिए चलती है।

चूंकि मेरी कुछ वस्तुओं के निर्माण के लिए कॉन्फ़िगरेशन फ़ाइलों में पढ़ने की आवश्यकता होती है, मैं ऑब्जेक्ट के निर्माण से कॉन्फ़िगरेशन की रीडिंग को अलग करने के लिए, इन इंस्टेंस को डीआईसी में वापस करने के लिए उपयोग कर रहा हूं। मैंने संबंधित प्लगइन प्रकारों के लिए डीआईसी में फैक्ट्री गेटर्स पंजीकृत किया।

अब कहते हैं कि मैं एक प्लगइन प्रकार IMotorठोस प्रकार के साथ Motor1और Motor2है, जो एक कारखाने के द्वारा नियंत्रित किया जाना चाहिए। मेरे डिवाइस को कॉन्फ़िगर करने के तरीके के बारे में अब मैं दो तरीके तय कर सकता हूं:

  1. मुझे लगता है कि दप एक करने के लिए पर चल रहा है डिवाइस के बारे में जानकारी पास MotorFactoryया तो और यह सही मोटर देता है, Motor1या Motor2। इस मामले में निर्णय लेने का तर्क फैक्टरी के अंदर है।
  2. मैं डिवाइस पर चल रहा है और दो कारखानों बनाने के अनुसार डीआईसी कॉन्फ़िगर Motor1Factoryऔर Motor2Factoryहै, जहां एक बनाता है Motor1और अन्य Motor2। इस मामले में मेरे पास IMotorडिवाइस-विशिष्ट रजिस्ट्रियों के लिए रजिस्ट्री प्रविष्टियों में अंतर होगा जो Motor1Factoryया तो उपयोग करते हैं या Motor2Factory

अब मेरा सवाल यह है कि इन दोनों में से कौन सी विधि बेहतर है और क्यों? मेरे लिए, ऐसा लगता है कि पहला मामला आगे और सीधा नहीं है, क्योंकि मैं उस तर्क को फैला रहा हूं जो यह तय करता है कि पूरे कोड-बेस में किस तरह का इंस्टेंट है। जबकि दूसरे मामले में मैं अपने कोड में कारखानों की संख्या को प्रभावी ढंग से बढ़ा रहा हूं, क्योंकि मुझे प्रत्येक ठोस प्रकार के लिए एक कारखाने की आवश्यकता होगी। यह मेरे लिए और भी भ्रामक हो जाता है, जब अमूर्त कारखानों को मिश्रण में मिलाया जाता है।

तो फिर से: मुझे एक विधि या दूसरे का उपयोग कब करना चाहिए? और अधिक महत्वपूर्ण बात: कौन सा रास्ता तय करने के लिए अच्छे संकेतक हैं?


2
कौन सा तरीका सरल है? क्या अधिक जटिल दृष्टिकोण का लाभ अतिरिक्त जटिलता की लागत से आगे निकल जाता है?
रॉबर्ट हार्वे

जवाबों:


2

यदि आप दोनों का उपयोग करते हैं तो मैं कुछ सरल करने जाऊंगा:

  • DI / IoC: हर कॉन्फ़िगरेशन के लिए जो रनटाइम पर नहीं बदलेगा।
  • फैक्टरी: रनटाइम पर वस्तुओं का उदाहरण बनाने के लिए जो रनटाइम इनपुट मापदंडों पर निर्भर करता है। कारखाने के उदाहरण डीआई कंटेनर द्वारा इंजेक्ट किए जाते हैं।

1

सार कारखानों का उपयोग तब किया जाता है जब आपके पास एक पदानुक्रम के माध्यम से संबंधित वस्तुएं होती हैं जिन्हें एक साथ अलग-अलग होने की आवश्यकता होती है। मैं यहाँ नहीं देख रहा हूँ।

जो मैं देख रहा हूं वह यह है कि आप सोच रहे हैं कि क्या किसी कारखाने को मोटर का चयन करना चाहिए या यदि डीआईसी को किसी विशेष मोटर का निर्माण करने वाली फैक्ट्री का चयन करना चाहिए।

यह ठीक से चुनना मुश्किल है क्योंकि एक कारखाना और एक डीआईसी बहुत समान चीजें करते हैं। अंतर यह है कि कारखाना किसी विशेष मुद्दे पर केंद्रित है और डीआईसी अधिक सामान्य है।

यह इस प्रश्न के लिए नीचे आता है: क्या आपके पास कोड की आवश्यकता है जो इस मुद्दे पर विशेष रूप से है जो कारखाने में रहेंगे? या यह एक फ़ाइल से कॉन्फ़िगरेशन विवरण पढ़ने की तरह अधिक सामान्य है?

ध्यान रखें कि जब आप केवल Motor1और Motor2आज के बीच चयन कर रहे हों, तो कल हो सकता है Motor3। उस डिज़ाइन को अनुकूल करें जो Motor3जोड़ना आसान बना देगा।


0

मैं बिल्डर (पैटर्न) नामक एक विशेष कारखाने में "किस मोटर का उपयोग करने के लिए" तर्क को अलग करूंगा और बिल्डर के कार्यान्वयनटन विस्तार के रूप में दोनों मोटर्स के लिए आईओसी-कंटेनर का उपयोग करूंगा ।

एक सामान्य नियम के रूप में:

  • यदि आपको कक्षा / इंटरफ़ेस की कई गतिशील वस्तुएँ बनानी हों तो आपको एक कारखाने (या एक बिल्डर) की आवश्यकता होती है। (यानी आपके द्वारा उत्पादित प्रत्येक कार के लिए आपको एक नई मोटर बनानी होगी)
  • यदि आपको एक वर्ग के केवल एक स्थिर उदाहरण की आवश्यकता है तो ioc / di आपके लिए काम कर सकता है (यानी आपको भुगतान सेवा के केवल एक स्थिर उदाहरण और MotorBuilderService के एक स्थिर उदाहरण की आवश्यकता है)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.