6

संभव डुप्लिकेट:
Why do I need an IoC container as opposed to straightforward DI code?asp.net MVC के में निर्भरता संकल्प और आईओसी के फायदे

मैं इस विषय पर कुछ लेख पढ़ सकते हैं और मैं किसी भी प्रतिभाशाली लाभ नहीं मिला। उदाहरण के लिए इस कोड:

//some action in a controller 
//simplest solution: 
var repository = new EmployeeRepository(); 
var model = repository.ListAllEmployees(); 

अच्छी तरह से आप कहते हैं कि हो सकता है: इस समाधान में, नियंत्रक/कार्रवाई बहुत EmployeeRepository पर निर्भर करता है। निर्भरता संकल्प है:

var repository = DependencyResolver.Current.GetService<IEmployeeRepository>(); 
var model = repository.ListAllEmployees(); 

मैं इसे नहीं मिला के बाद एक किसी भी निर्भरता संकल्प/आईओसी के बिना की तुलना में किसी भी बेहतर:

var model = Managers.EmployeeManager.ListAllEmployees(); 

आशा कोई मुझे कुछ विचार/लिंक/पोस्ट पर दे सकते हैं यह विषय।

उत्तर

5

नियंत्रण में उलटा होने का मुख्य लाभ decoupling है। Decoupling द्वारा आप रखरखाव में सुधार। आपका नियंत्रक/क्रिया इंटरफेस पर निर्भर करता है और कार्यान्वयन नियंत्रक में इंजेक्शन दिया जाता है।

आईओसी कंटेनर के माध्यम से निर्भरता संकल्प कंटेनर को कॉन्फ़िगर करके अपने नियंत्रक के लिए निर्भरता इंजेक्शन तर्क को सरल बनाता है। जहां यह वास्तव में स्पष्ट हो जाता है कि यदि एक वर्ग किसी सेवा पर निर्भर करता है, तो वह सेवा अन्य सेवाओं पर निर्भर करती है और ये सेवाएं अधिक सेवाओं पर भी निर्भर करती हैं, कंटेनर उस निर्भरता संकल्प को संभालेगा।

बहुत से लोग आपको अपने कोड का परीक्षण करने में सक्षम होने के लिए नियंत्रण में बदलाव को लागू करने के लिए कह सकते हैं, यह नियंत्रण प्रस्तावों में उलझन में नहीं है, यह आपके कोड को अधिक टेस्ट करने योग्य बनाता है लेकिन यह मुख्य कारण नहीं है।

10

निर्भरता रेसोलवर के साथ आपका उदाहरण आपके मूल कोड से कहीं बेहतर नहीं है, इसलिए हाँ .. ऐसा करने का कोई फायदा नहीं है।

शुक्र है, यह वही तरीका नहीं है जिसे आप करना चाहते हैं। इसके बजाय, आप कन्स्ट्रक्टर या प्रॉपर्टी इंजेक्शन का उपयोग करते हैं।

मैं @adriaanp से सहमत हूं, आसान इकाई परीक्षण केवल निर्भरता इंजेक्शन का एक पक्ष लाभ है। सबसे बड़ा लाभ यह है कि यह निर्भरता मुक्त वास्तुकला को प्रोत्साहित करता है। आपकी कक्षाएं अकेले खड़े हैं, और एक विशिष्ट कार्यान्वयन (इसके इंटरफ़ेस और आवश्यकताओं के अलावा) पर निर्भर नहीं हैं

एक और लाभ यह है कि एक आईओसी कंटेनर आपकी निर्भरताओं के जीवनकाल को नियंत्रित कर सकता है। मान लीजिए कि आप वेब पेज में अनुरोध के जीवनकाल के लिए एक वस्तु मौजूद होना चाहते हैं। यह भी मान लें कि आप इस ऑब्जेक्ट को कई अलग-अलग वर्गों में एक्सेस करना चाहते हैं। आप ऑब्जेक्ट को अपने पेज लोड इवेंट में बना सकते हैं, फिर इसे अपने द्वारा बनाए गए हर ऑब्जेक्ट पर पास कर दें। हालांकि, इसका मतलब यह हो सकता है कि आपको उन ऑब्जेक्ट्स को पास करने की आवश्यकता है जो वास्तव में इसका उपयोग नहीं करते हैं, क्योंकि वे ऑब्जेक्ट्स बनाते हैं जिन्हें इसकी आवश्यकता होती है (या वे ऑब्जेक्ट्स बनाते हैं जो ऑब्जेक्ट्स की आवश्यकता होती है, या .. और इसी तरह)।

निर्भरता इंजेक्शन और आईओसी कंटेनर के साथ, कंटेनर ऑब्जेक्ट के जीवनकाल को नियंत्रित करता है, और यह उन वस्तुओं में इंजेक्शन देने से संबंधित है जिनकी आवश्यकता है। आपको इसे अपने डिजाइन में बनाना नहीं है। आप इसे मुफ्त में प्राप्त करें।

और अंत में, परीक्षण समस्या के लिए।जब आप कुछ परीक्षण करते हैं, यदि इसमें हार्ड कोड कोड है, तो आप टेस्ट डेटा को खिलाने के लिए आसानी से इसे मॉक ऑब्जेक्ट से प्रतिस्थापित नहीं कर सकते हैं। मान लीजिए कि आप यह जांचना चाहते हैं कि कोई ऑब्जेक्ट सही मान की गणना करता है। ज्ञात मूल्यों के साथ परीक्षण डेटा को खिलााना इसे परीक्षण करना आसान बनाता है।