ठीक है, पहले बंद करो, "नए निर्भरता को जोड़ने पर ctor को कॉल करने के लिए अद्यतन करने की आवश्यकता होगी" किसी भी कोड से निपटें; स्पष्ट होने के लिए, यदि आप निर्भरता इंजेक्शन कर रहे हैं और आपके पास निर्भरता वाली किसी वस्तु पर नया () कॉलिंग कोड है, तो आप इसे गलत कर रहे हैं ।
आपका DI कंटेनर सभी प्रासंगिक निर्भरताओं को इंजेक्ट करने में सक्षम होना चाहिए, इसलिए आपको कंस्ट्रक्टर हस्ताक्षर को बदलने के बारे में चिंता करने की आवश्यकता नहीं है, ताकि तर्क वास्तव में पकड़ में आए।
प्रति-विधि बनाम प्रति-वर्ग इंजेक्शन विचार के लिए, प्रति-विधि इंजेक्शन के साथ दो प्रमुख मुद्दे हैं।
एक मुद्दा यह है कि आपकी कक्षा की विधियाँ निर्भरताएँ साझा करती हैं, यह सुनिश्चित करने में मदद करने का एक तरीका है कि आपकी कक्षाएं प्रभावी रूप से अलग हो जाएं, यदि आप बड़ी संख्या में आश्रितों वाली श्रेणी देखते हैं (संभवतः 4-5 से अधिक) तो वह वर्ग एक प्रमुख उम्मीदवार है दो वर्गों में परावर्तन के लिए।
अगला मुद्दा यह है कि निर्भरता, प्रति-विधि "इंजेक्ट" करने के लिए, आपको उन्हें विधि कॉल में पास करना होगा। इसका मतलब यह है कि आपको विधि कॉल से पहले निर्भरता को हल करना होगा, इसलिए आप इस तरह कोड का एक गुच्छा के साथ समाप्त हो जाएंगे:
var someDependency = ServiceLocator.Resolve<ISomeDependency>();
var something = classBeingInjected.DoStuff(someDependency);
अब, कहते हैं कि आप अपने आवेदन के चारों ओर 10 स्थानों पर इस पद्धति को कॉल करने जा रहे हैं: आपके पास इनमें से 10 स्निपेट्स होंगे। इसके बाद, मान लें कि आपको DoStuff में एक और निर्भरता जोड़ने की आवश्यकता है (): आप उस स्निपेट को 10 बार बदलने जा रहे हैं (या इसे एक विधि में लपेटेंगे, जिस स्थिति में आप बस DI व्यवहार को मैन्युअल रूप से दोहरा रहे हैं, जो एक बेकार है समय की)।
इसलिए, आपने जो कुछ किया है, वह आपके DI-यूज़ करने वाली कक्षाओं को उनके खुद के DI कंटेनर से अवगत कराता है, जो एक मौलिक रूप से बुरा विचार है , क्योंकि यह बहुत जल्दी एक क्लंकी डिज़ाइन की ओर जाता है जिसे बनाए रखना मुश्किल है।
इसकी तुलना कंस्ट्रक्टर इंजेक्शन से करें; कंस्ट्रक्टर इंजेक्शन में आप एक विशेष DI कंटेनर से बंधे नहीं हैं, और आप अपनी कक्षाओं की निर्भरता को पूरा करने के लिए सीधे जिम्मेदार नहीं हैं, इसलिए रखरखाव काफी सिरदर्द-मुक्त है।
ऐसा लगता है जैसे आप असंबंधित सहायक विधियों का एक समूह युक्त IoC को वर्ग में लागू करने की कोशिश कर रहे हैं, जबकि आप सहायक वर्ग को उपयोग के आधार पर कई सेवा वर्गों में विभाजित करने से बेहतर हो सकते हैं, फिर सहायक को सौंपने के लिए सहायक का उपयोग करना कहता है। यह अभी भी एक महान दृष्टिकोण नहीं है (सहायक विधियों के साथ वर्गीकृत किया गया है, जो केवल उन तर्कों से निपटने के मुकाबले अधिक जटिल हैं जो आमतौर पर उन्हें पारित कर दिए जाते हैं, आमतौर पर बुरी तरह से लिखित सेवा वर्ग होते हैं), लेकिन यह कम से कम आपके डिजाइन को थोड़ा साफ रखेगा ।
(एनबी मैंने उस दृष्टिकोण को किया है जो आप पहले सुझा रहे हैं, और यह एक बहुत बुरा विचार था जिसे मैंने दोहराया नहीं है। मुझे पता चला कि मैं उन कक्षाओं को अलग करने की कोशिश कर रहा था जिन्हें वास्तव में अलग होने की आवश्यकता नहीं थी, और समाप्त हो गई। इंटरफेस के एक सेट के साथ जहां प्रत्येक विधि कॉल के लिए अन्य इंटरफेस के एक निश्चित-निश्चित चयन की आवश्यकता होती है। यह बनाए रखने के लिए एक बुरा सपना था।)