17

मुझे लगता है कि लीड डेवलपर्स इस तरह के कोड लिख रहे हैं और मार्क सीमैन की पुस्तक ".NET में निर्भरता इंजेक्शन" पढ़ने पर मुझे आश्चर्य है कि विशिष्ट "नया" "विदेशी" है, इस प्रकार "बास्टर्ड इंजेक्शन" ??क्या यह "बास्टर्ड इंजेक्शन एंटी-पैटर्न" का एक अच्छा उदाहरण है?

public class SessionInitServiceManager 
{ 
    protected readonly ICESTraceManager _traceManager; 
    protected readonly ILogger _logger; 
    protected readonly IAggregateCalls _aggregator; 
    protected readonly IMultiCoreRepository _repository; 

    public SessionInitServiceManager(ICESTraceManager traceManager, 
            ILogger logger, 
            IAggregateCalls aggregator, 
            IMultiCoreRepository repository) 
    { 
     _traceManager = traceManager; 
     _logger = logger; 
     _aggregator = aggregator; 
     _repository = repository; 
    } 

    public SessionInitServiceManager() : this(new CESTraceManager(), 
               new Logger("BusinessServices.authenticateUser"), 
               new Aggregator(), 
               new RepositoryFactory().BuildMultiCoreRepository()) { } 
+0

एक अलग रूप में के रूप में, चार मापदंडों सीमा धक्का है समझदार डी (लेखक का कहना है कि उनकी सीमा आम तौर पर चार है) क्योंकि यह आपको पूछताछ शुरू करने के लिए मजबूर करता है कि सत्रInitServiceManager एसआरपी का उल्लंघन कर रहा है या नहीं। किसी अन्य प्रबंधक वर्ग में उत्तीर्ण करने से यह भी पता चलता है कि यह मामला हो सकता है। – RichK

+0

हाँ, मुझे याद है कि 3-4 सामान्य सीमा है। इस नए मुद्दे को बिना किसी आईओसी कंटेनर के साथ या बिना किसी नए मुद्दे से बचने के किसी भी अच्छे उदाहरण। –

+4

उत्तर इस बात पर निर्भर करता है कि किसी भी 'डिफ़ॉल्ट' कार्यान्वयन को उसी लाइब्रेरी में या एक अलग पुस्तकालय में परिभाषित किया गया है या नहीं ary। http://stackoverflow.com/questions/6733667/is-there-an-alternative-to-bastard-injection-aka-poor-mans-injection-via-defa/6739953#6739953 –

उत्तर

9

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

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

+0

यह मेरे लिए सही लगता है। धन्यवाद! –

0

मैंने उस पुस्तक को, एक दोस्त से .NET में निर्भरता इंजेक्शन उधार लिया था। जो आप कह रहे हैं, वो मुझे समझ आ रहा है। मुझे विश्वास है कि यह "बेस्टर्ड इंजेक्शन" है। यह एक क्रूर शब्द है, लेकिन मुझे लगता है कि सभी कोल्डफ्यूजन (खांसी) के बाद भाषा के हिस्से के रूप में एक "CFABORT" टैग है।

इसके अलावा, मैंने एक अच्छा लेख देखा, ब्लॉग पोस्ट How not to do dependency injection - the static or singleton container

असल में, इससे पहले कि हम शुरू करते हैं, चलो कुछ रास्ते से हट जाओ:

निर्भरता इंजेक्शन = एक आईओसी कंटेनर का उपयोग करते हुए यह स्थिर कंटेनर के जन्म कि "

यहाँ किकर है,"। इसके बजाय नियंत्रक निर्भरता में लेने के लिए की निर्माता बदलने की है, हम बस लाइन जहां सेवा यह कंटेनर के बजाय का उपयोग कर हल करने instantiated है बदल रहे हैं। "

public class HomeController 
{ 
    private readonly IExampleService _service; 

    public HomeController() 
    { 
     _service = Container.Instance.Resolve<IExampleService>(); 
    } 

    public ActionResult Index() 
    { 
     return View(_service.GetSomething()); 
    } 
} 
+3

डिफ़ॉल्ट कन्स्ट्रक्टर के अंदर आप वास्तव में सेवा लोकेटर एंटी-पैटर्न का उपयोग कर रहे हैं, आप कैसे जानते हैं कि कंटेनर के लिए आपके लिए IExampleService होगा? और अगर ऐसा नहीं होता है? इंडेक्स विधि NullArgumentException पर, और डिज़ाइन समय में यह "ठीक" दिखता है। यह एक आईओसी कंटेनर का उपयोग नहीं कर रहा है, यह गलत तरीके से DI को लागू करता है –

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

  • कोई संबंधित समस्या नहीं^_^