आप निर्भरता इंजेक्शन के साथ विन्यास कैसे प्रबंधित करते हैं?


18

मैं DI / IOC का बहुत बड़ा प्रशंसक हूं। यह कठिन निर्भरता को दूर करने / अमूर्त करने के लिए महान है, और जीवन को थोड़ा आसान बनाता है।

हालांकि मेरे पास इसके साथ एक छोटी सी पकड़ है, जो मुझे नहीं पता कि कैसे हल करना है।

DI / IOC में मूल विचार यह है कि जब किसी वस्तु को त्वरित किया जाता है, तो उसकी सभी निर्भरताएं निर्माता के भीतर पहले से भरी होती हैं।

हालांकि IMHO में कंस्ट्रक्टरों के लिए कई प्रकार के पैरामीटर हैं (विशेषकर जब आपकी वस्तुएँ अपरिवर्तनीय हों)।

  1. निर्भरता (काम करने के लिए आपकी वस्तु के लिए आवश्यक वस्तुएं)
  2. कॉन्फ़िगरेशन (काम करने के लिए आवश्यक पर्यावरण के बारे में जानकारी)
  3. पैरामीटर (डेटा जो काम किया जाता है)

मुझे लगता है कि IOC निर्भरता के साथ अच्छी तरह से काम करता है। लेकिन मैं अभी भी अन्य दो से निपटने के लिए सबसे अच्छा तरीका निकालने की कोशिश कर रहा हूं। हालाँकि, चूंकि कंस्ट्रक्टर को IOC कंटेनर द्वारा चलाया जाता है, इसलिए ऐसा लगता है कि मुझे इन आइटम्स को IOC कंटेनर में रखने की आवश्यकता है।

मैं जानना चाहता हूं कि लोग किन रणनीतियों / प्रतिमानों को नियोजित करते हैं और लोगों को क्या फायदे और नुकसान मिलते हैं।

एनबी। मुझे पता है कि यह एक अत्यधिक व्यक्तिपरक प्रश्न है, और एसई दिशानिर्देशों के अनुसार इसे "अच्छा" व्यक्तिपरक प्रश्न बनाने की कोशिश की है।


"कॉन्फ़िगरेशन" से क्या आपका मतलब देव-पर्यावरण विन्यास (जैसे विकास या उत्पादन) से है? यदि हां, तो मैं आमतौर पर एक पारंपरिक निर्भरता के रूप में संभालता हूं।
मेटाफ़ाइट

निर्भरता लेकिन डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ निर्माण करने के लिए सबसे अच्छा है ताकि ऑब्जेक्ट अच्छी तरह से बन जाए। कॉन्फ़िगरेशन और अन्य पैरामीटर सेट करने के लिए अतिरिक्त तरीके कॉल करें। Ctor में बहुत ज्यादा काम करना एक बुरी बात है।
david.pfx

I am still trying to work out the best way to deal with the other two- उन्हें अपनी वस्तु में साधारण पैरामीटर के रूप में पास करें?
रॉबर्ट हार्वे

@RobertHarvey अपरिवर्तनीय वस्तुएं? वे डिबगिंग को बहुत आसान बनाते हैं।
ArTs

जवाबों:


9

कॉन्फ़िगरेशन (काम करने के लिए आवश्यक पर्यावरण के बारे में जानकारी)

कॉन्फ़िगरेशन क्लास बनाएं (पिकी होने के लिए: एक इंटरफ़ेस + एक कार्यान्वयन) जिसका उद्देश्य पर्यावरण के बारे में जानकारी प्रदान करना है। यह आपके ऑब्जेक्ट को कार्य करने के लिए आवश्यक अन्य ऑब्जेक्ट्स से अलग तरीके से कॉन्फ़िगरेशन बनाता है (बिंदु 1)।

पैरामीटर (डेटा जो काम किया जाता है)

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


1

मैं इन मामलों के लिए एक कारखाना पैटर्न क्या हूं।

मैं ऑब्जेक्ट को केवल एक निर्भरता के रूप में उपयोग नहीं करता हूं, लेकिन एक फैक्ट विधि का निर्माण एक गेट विधि के साथ करता हूं जो मापदंडों को स्वीकार करता है जो कंटेनर द्वारा स्वचालित रूप से बाध्य नहीं किया जा सकता है।

पूर्व .:

 interface IDependencyObject {
       ....
 }

 class DependencyObject {

      public DependencyObject(int primitive, IAnotherDependency anotherDependency) {
      ...
      }

 }

 class DependencyObjectFactory {

      private readonly IAnotherDependency anotherDependency;

      public DependencyObjectFactory(IAnotherDependency anotherDependency) {
           this.anotherDependency = anotherDependency;
      }

      public IDependencyObject Get(int primitive) {
           return new DependencyObject(primitive, anotherDependency);
      }
 }

 interface IDependencyObjectFactory {
       IDependencyObject Get(int primitive);
 }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.