आम तौर पर जब मुझे किसी अन्य सेवा में एक या अधिक सेवाओं को इंजेक्ट करने की आवश्यकता होती है, तो मैं स्पष्ट रूप से प्रत्येक को इंजेक्ट करता हूं। हालांकि, मेरे पास ऐसी स्थिति है जहां सेवा कंटेनर इंजेक्शन देने से वास्तव में चीज़ें आसान हो जाएंगी। मुझे पता है कि यह एक अनुशंसित अभ्यास नहीं है, लेकिन मुझे उत्सुकता है कि तकनीकी कारणों को हतोत्साहित करने के लिए क्या हैं। क्या यह कुछ वैध है जैसे यह बहुत संसाधन गहन है, या एक और व्यक्तिगत भावना है कि यह बहुत गन्दा है?व्यक्तिगत सेवाओं की बजाय सेवा कंटेनर इंजेक्शन से बचने के तकनीकी कारण क्या हैं?
उत्तर
यदि आप कंटेनर इंजेक्ट करते हैं, तो आप निर्भरता को स्पष्ट नहीं कर रहे हैं। वास्तव में, आप उन्हें पहले से अधिक अस्पष्ट कर रहे हैं। यदि आपके पास इस तरह की कक्षा है ...
class DocumentCreator(IFileNamer fileNamer, IRepository repository)
{ ... }
... आप देख सकते हैं कि निर्भरता क्या हैं। आप यूनिट परीक्षण के लिए उन निर्भरताओं को आसानी से नकल भी कर सकते हैं, यह सुनिश्चित करने के लिए कि आप दस्तावेज़ निर्माता को अलग करते हैं और यह जान सकते हैं कि कोई परीक्षण विफलता इसकी निर्भरता में से किसी एक कोड के बजाय कोड का परिणाम है।
, तो दूसरी ओर, यदि आप ऐसा करते ...
class DocumentCreator(IDependencyContainer container)
{ ... }
... आप निर्भरता छिप गए हैं। कक्षा के आंतरिक भाग की जांच किए बिना आप नहीं जानते, कि इसे आईफाइलनामर और आईरिपोजिटरी की आवश्यकता है।
न ही आप आसानी से जानते हैं कि दस्तावेज़ निर्माता का परीक्षण करने के लिए आपको कंटेनर में क्या मोक्स लगाने की आवश्यकता है। IDependencyContainer का मज़ाक उड़ाएगा आपकी मदद नहीं करेगा; आपकी कक्षा अभी भी परीक्षण में विफल रहेगी क्योंकि कंटेनर में IFileNamer और एक आईरिपोजिटरी नहीं होगी, जब तक कि आप कक्षा के आंतरिक भाग की जांच न करें, यह देखने के लिए कि उनकी आवश्यकता है।
मुझे लगता है कि इस दृष्टिकोण के साथ मुख्य समस्या यह है कि आप अब निर्भरताओं को स्पष्ट रूप से नहीं देखते हैं। एक और समस्या यह हो सकती है कि परीक्षण करना अधिक कठिन हो।
जो आप वर्णन करते हैं वह एक सेवा लोकेटर है। इसे आधुनिक अनुप्रयोग डिजाइन में एक विरोधी पैटर्न माना जाता है। This article क्यों बताता है।
झूठा। लोगों को वास्तव में उस दोस्त के ब्लॉग से जुड़ना बंद करना होगा। यहां पैटर्न के एक अधिक कुशल मास्टर से अंतर्दृष्टि है। http://www.martinfowler.com/articles/injection.html – Colin
@ कोलिन आपने कभी भी सेवा-प्रकाशक को एंटी-पैटर्न घोषित करने के लिए मार्क सीमैन के तर्क को पढ़ा है? आप केवल पूर्ण निर्भरता इंजेक्शन के कुछ फायदे प्राप्त करते हैं लेकिन कुछ लाभों को याद करते हैं (यानी निर्भरताओं की तत्काल दृश्यता)। मैं अतिरिक्त एसएल सॉफ्टवेयर डिजाइन के विभिन्न नियमों का उल्लंघन करता हूं जैसे encapsulation http://blog.ploeh.dk/2015/10/26/service-locator-violates-encapsulation/ या SOLID http://blog.ploeh.dk/2014/05/15/सेवा-लोकेटर-उल्लंघन-ठोस/ –
हां, और यह बकवास है। वास्तव में, उनके तर्क के विपरीत सच है। उदाहरण के लिए, वह कहता है कि यह "खराब encapsulation" है, लेकिन encapsulation का पूरा बिंदु वर्ग के आंतरिक विवरण को छिपाना है कि कॉलर से चिंतित नहीं होना चाहिए (जैसे सत्यापन, जिसे वह अपने उदाहरण में बाहरी बनाता है)। DI में स्पष्ट अनुप्रयोग और लाभ हैं लेकिन यह "सुनहरा हथौड़ा" नहीं है; यह एक विरोधी पैटर्न है। सोचें कि क्या आपको TraceLrreneners में हर बार Trace.WriteLine() या Debug.WriteLine() कहा जाता है! मेरी इच्छा है कि लोग एक विशेषज्ञ की तरह श्रीमान सेमान का इलाज करना बंद कर देंगे; वह सिर्फ एक राय वाला ब्लॉगर है। – Colin
- 1. क्या बड़ी जावा परियोजनाओं में अत्यधिक उलझन में पैकेज निर्भरता बनाने से बचने के तकनीकी कारण हैं?
- 2. क्या यह तकनीकी रूप से वेबसाइट की स्क्रीनशॉट लेने के लिए तकनीकी रूप से संभव है?
- 3. फैक्टरी कक्षाओं के भार लिखने से बचने के लिए कन्स्ट्रक्टर इंजेक्शन के बजाय सर्विसिकेलोकेशन का उपयोग करना बुरा है
- 4. फोनगैप/कॉर्डोवा की तकनीकी सीमाएं क्या हैं?
- 5. ज़ेंड डि बनाम सेवा प्रबंधक निर्भरता इंजेक्शन कंटेनर
- 6. एएसएमएक्स वेब सेवा के बजाय डब्ल्यूसीएफ सेवा?
- 7. सेवाओं के बाहर Grails निर्भरता इंजेक्शन?
- 8. "इटेनियम फियास्को" के पीछे तकनीकी कारण क्या हैं, यदि कोई हो?
- 9. निर्भरता इंजेक्शन कंटेनर (PHP)
- 10. निर्भरता इंजेक्शन कंटेनर? यह क्या करता है?
- 11. यूनिटी कंटेनर, व्यक्तिगत ऑब्जेक्ट्स को हल करें
- 12. कंटेनर/एडाप्टर क्या हैं? सी ++
- 13. PHPUnit परीक्षण केस symfony2 निर्भरता इंजेक्शन कंटेनर
- 14. क्या तकनीकी कारण हैं EF 5 .NET4.0 पर पूरी तरह से समर्थित नहीं है?
- 15. डब्ल्यूसीएफ सेवा के लिए डेटा इंजेक्शन
- 16. वसंत (एमवीसी) एसक्यूएल इंजेक्शन से बचने के लिए?
- 17. निर्भरता इंजेक्शन कंटेनर - फैक्टरी पैटर्न
- 18. मानक कंटेनर में तत्वों के डिफ़ॉल्ट निर्माण से बचने
- 19. रोबोट() के पीछे तकनीकी, अंतर्निहित कारण क्या हैं। CreateScreenCapture() इतना धीमा हो रहा है?
- 20. एक्सएमएल इंजेक्शन से बचने के लिए कैसे करें
- 21. डोमेन ऑब्जेक्ट्स से सेवाओं तक पहुंचने के नियम
- 22. कन्स्ट्रक्टर इंजेक्शन के बजाय प्रॉपर्टी इंजेक्शन का उपयोग
- 23. क्या किसी तकनीकी कारण का उपयोग करने के लिए या सी # में var का उपयोग नहीं करने के लिए कोई तकनीकी कारण है?
- 24. निर्भरता इंजेक्शन, एक newable (इकाई) में एक "इंजेक्शन" वस्तु (सेवा)
- 25. व्यक्तिगत तत्वों की बजाय एक सिंडिकेशन में नामस्थान जोड़ना?
- 26. CSS3 मीडिया क्वेरी - स्क्रीन के बजाय कंटेनर की चौड़ाई?
- 27. निर्भर सेवाओं को इंजेक्शन करते समय यूनिट परीक्षण AngularJS सेवाएं
- 28. आईओसी कंटेनर के माध्यम से डब्ल्यूसीएफ सेवा तत्कालता
- 29. निर्भरता इंजेक्शन ढांचे कंटेनर पदानुक्रमों का समर्थन क्यों करते हैं?
- 30. वेब सेवाओं की सुरक्षा
मैं निश्चित रूप से पहले भाग से सहमत हूं, और यही कारण है कि दुर्लभ स्थितियों को छोड़कर मैं अभी भी विशिष्ट सेवाओं को इंजेक्ट करना जारी रखता हूं। लेकिन मुझे यकीन नहीं है कि इसका परीक्षण कैसे करना मुश्किल होगा? –
यह कंटेनर ऑब्जेक्ट बनाने के लिए इंगित करेगा, और इसमें इंजेक्ट करने के बजाय मजाक (या मजाक नहीं) सेवाओं को इंजेक्ट करेगा, जो एक और कदम बनाता है। – greg0ire
हम्म, यह निश्चित रूप से एक बड़ा नुकसान है। –