2009-09-27 12 views
5

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

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

उदाहरण के लिए, अतीत में हमने लिखा हो सकता है:

CreditEntity creditObj = CreditEntityManager.GetCredit(customerId); 
Decimal creditScore = CreditEntityManager.CalculateScore(creditObj); 
return creditScore; 

अब, डि साथ, एक ही कोड होगा:

//not shown, _creditService instantiation/injection in c-tors 
CreditEntity creditObj = _creditService.GetCredit(customerId); 
Decimal creditScore = _creditService.CalculateScore(creditObj); 
return creditScore; 

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

+5

"टेस्टेबिलिटी के अलावा, डीआई का उपयोग करने का बड़ा फायदा क्या है" यह कहने की तरह है "मेरे सिर पर छत रखने के अलावा, मुझे नौकरी रखने में बड़ा फायदा क्या है"। – TrueWill

उत्तर

5

डीआई के लिए सवाल। हो सकता है: CreditEntityManager वास्तव में CreditEntity और CalculateScore पर कहां जाना है, इस बारे में ज्ञान को केंद्रीकृत करने के लिए प्राकृतिक स्थान है?

मुझे लगता है कि डीआई का सिद्धांत। एक मॉड्यूलर आवेदन बात एक्स में शामिल जरूरी कैसे बात वाई भले ही एक्स जरूरतों वाई के साथ हुक करने की नहीं जानता है कि है।

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

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

+0

तो इन-हाउस सेवाओं/घटकों के लिए जो विशेष रूप से encapsulated नहीं हैं (यानी हम उन्हें कभी बाहर स्वैप नहीं करेंगे), डीआई। एक बहुत सारे लाभ प्रदान नहीं करता है? –

+1

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

1

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

1

इस पर 1002 बार चर्चा की गई है।

  1. http://scruffylookingcatherder.com/archive/2007/08/07/dependency-injection.aspx
  2. http://ayende.com/Blog/archive/2007/08/18/Dependency-Injection-More-than-a-testing-seam.aspx
  3. http://kohari.org/2007/08/15/defending-dependency-injection
  4. http://scruffylookingcatherder.com/archive/2007/08/16/tilting-at-windmills.aspx
  5. http://ayende.com/Blog/archive/2007/08/18/Dependency-Injection-IAmDonQuixote.aspx
  6. http://scruffylookingcatherder.com/archive/2007/08/20/poking-bears.aspx
  7. http://ayende.com/Blog/archive/2007/08/21/Dependency-Injection-Applicability-Benefits-and-Mocking.aspx
  8. : यहाँ एक ऐसी चर्चा है कि मुझे याद है (क्रम में पढ़ें) है

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

+0

लेकिन यदि कोई सेवा क्षणिक है, तो ऑब्जेक्ट को तत्काल क्यों करें? स्थैतिक वस्तुओं को स्थैतिक रूप से स्थिर वर्ग द्वारा प्रतिनिधित्व नहीं किया जाएगा? –

+0

एक डी कंटेनर का उपयोग करते समय आप बस अपनी सेवा को कोड करते हैं और फिर कंटेनर को प्रत्येक सेवा के लिए उपयुक्त जीवनशैली के साथ कॉन्फ़िगर करते हैं (यह प्रति-वेब-अनुरोध, प्रति-थ्रेड या कुछ भी हो सकता है) ऐसा करने के लिए सेवा को तत्काल होना चाहिए। यदि आपको संदेह है तो कृपया अन्य प्रश्न बनाएं। सटीक गणना देने के लिए –

+0

+1। जबरदस्त हंसी! – TrueWill

0

Guice video है जो डीआई का उपयोग करने के लिए एक अच्छा नमूना मामला देता है। यदि आप बहुत सी 3-पार्टी पार्टी सेवाओं का उपयोग कर रहे हैं जिन्हें गतिशील रूप से डी.आई. तक लगाया जाना चाहिए, तो मैं बहुत मददगार होगा।