2012-07-04 10 views
6

मैं मार्क सीनैन द्वारा .NET में निर्भरता इंजेक्शन पढ़ रहा हूँ और मैं मुझे के जीवन के लिए मेरे सिर इस के चारों ओर लिपटा नहीं कर सकते हो:डि नियंत्रण-फ्रीक विरोधी पैटर्न: समस्या आ रही है समझने

हालांकि नया कीवर्ड कोड कोड गंध है जब यह वोल्टाइल डिप्लेन्सीज़ की बात आती है, तो आपको STABLE DEPENDENCIES के लिए इसका उपयोग करने की चिंता करने की आवश्यकता नहीं है। नया कीवर्ड सामान्य रूप से अचानक "अवैध" नहीं है, लेकिन आपको वोल्टाइल डिप्लेंडर के उदाहरण प्राप्त करने के लिए इसका उपयोग करने से बचना चाहिए।

शायद यह है क्योंकि मैं अभी भी सिर्फ एक वैश्विक चर के बजाय एक इंजेक्शन जा रहा है परिवेश संदर्भ चारों ओर हो लिपटे नहीं कर सकते हैं मेरे सिर, लेकिन मैं तो बस नहीं मिल रहा है क्या लेखक कह रहा है है।

मैं वास्तव में DI शीर्ष से नीचे समझना चाहता हूं लेकिन अभी मैं अटक गया हूं और यह पुस्तक के माध्यम से सिर्फ 1/3 रास्ता है ... नियंत्रण-फ्रीक विरोधी पैटर्न प्रत्येक एकल लगता है प्रोग्रामर जो कभी रहता था ...

किसी के पास कोई अंतर्दृष्टि है?

+1

http://jamesshore.com/Blog/Dependency-Injection-Demystified.html देखें। आसपास के बारे में DI के बारे में बहुत अधिक जटिल लेख हैं, हालांकि वास्तव में इसके लिए बहुत कुछ नहीं है। मैंने लेख को काफी प्रबुद्ध पाया :-)। – helpermethod

उत्तर

7

अस्थिरता (मेरे लिए) इस तरह की एक माप है कि एक वर्ग को बदलने की आवश्यकता होगी।

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

एनडपेन्स (एक नेट स्थिर विश्लेषण मीट्रिक उपकरण) में नामक मीट्रिक है जो मेरे दिमाग में समानार्थी है। वे इसे परिभाषित करते हैं:

अस्थिरता (I): कुल युग्मन के लिए अपरिपक्व युग्मन (सीई) का अनुपात। मैं = सीई/(सीई + सीए)। यह मीट्रिक असेंबली के बदलने के लिए लचीलापन का संकेतक है। इस मीट्रिक की सीमा 0 से 1 है, I = 0 एक पूरी तरह से स्थिर असेंबली का संकेत देती है और I = 1 पूरी तरह से अस्थिर असेंबली को इंगित करती है।

आप नहीं चाहते कि स्थिर वर्ग कम स्थिर वाले पर निर्भर हों।

जहां तक ​​इंजेक्ट करने का निर्णय लेना है या नहीं, यह कक्षा की भूमिका के मुद्दे की तरह लगता है। डोमेन संचालित डिजाइन से, (डीडीडी) कक्षाएं आम तौर पर या तो संस्थाएं होती हैं (उनकी पहचान होती है), सेवाएं (वे चीजों को ऑर्केस्ट्रेट करते हैं) या मान (वे अपरिवर्तनीय और तुलनीय हैं, जैसे लाल या 100 मिलीलीटर)।

आप सेवाओं को इंजेक्ट करेंगे, आप मूल्यों पर नए कॉल करेंगे। संस्थाएं आम तौर पर एक भंडार से आती हैं (जिसे आप इंजेक्ट करते हैं), लेकिन आंतरिक रूप से रिपोजिटरी उन पर नया कॉल करेगी। क्या उससे मदद हुई?

1

आमतौर पर डी कंटेनर कंक्रीट कार्यान्वयन के लिए सभी निर्भरताओं को हल करता है और आपके लिए जीवन भर संभालता है। लेकिन डी कंट्रोल-फ्रीक विपरीत है: new कीवर्ड का उपयोग करके कंक्रीट ऑब्जेक्ट बनाता है, उन्हें इंजेक्ट करता है और केवल जीवन समय को ही संभालता है। इसलिए, किसी और को आपके कोड से बाहर निर्भरताओं को कॉन्फ़िगर करने और संभालने की संभावना नहीं है। और इस प्रकार, अन्य कार्यान्वयन या नकली प्रदान करके इसका पुन: उपयोग या परीक्षण करें।

मैं इसे सनकी नियंत्रण एक वर्ग का वर्णन करने के नाम पर रखा गया है कि नहीं अपनी निर्भरता त्यागना नियंत्रण करेंगे:

यहाँ @ मार्क-सीनैन की पुस्तक है कि आपके सवाल का जवाब से प्रशस्ति पत्र है।

यह हर बार हम नई कुंजी शब्द का उपयोग करके एक प्रकार का एक नया उदाहरण बनाने होता है। जब हम ऐसा करते हैं, तो हम स्पष्ट रूप से बताते हैं कि हम के जीवनकाल को नियंत्रित करने जा रहे हैं और किसी और को उस विशेष वस्तु को रोकने का मौका नहीं मिलेगा।

1

मैंने इन शर्तों को पहले नहीं सुना है, लेकिन निर्भरता इंजेक्शन के बारे में मुझे जो पता है, उसे ट्रांसपोज़ करना, मैं उन्हें निम्नानुसार परिभाषित करता हूं।

एक स्थिर निर्भरता वह है जिसका कंक्रीट कार्यान्वयन समय या विभिन्न स्थितियों में कक्षा या कॉन्फ़िगरेशन में भिन्न नहीं होगा।

एक अस्थिर निर्भरता वह है जिसका कंक्रीट कार्यान्वयन कक्षा या कॉन्फ़िगरेशन में समय के साथ या विभिन्न परिस्थितियों में भिन्न हो सकता है।

यदि आप जावा में एक उदाहरण माफ कर सकते हैं, तो एक स्थिर निर्भरता StringBuilder होगी। यदि आप एक स्ट्रिंग बनाने के लिए एक विधि लिख रहे हैं, तो आपको StringBuilder इंजेक्शन देने की आवश्यकता नहीं है, आप इसे अभी बना सकते हैं। ArrayList, HashMap, आदि के लिए डिट्टो, यदि आप एक बैंकिंग एप्लिकेशन लिख रहे थे, तो मानक लाइब्रेरी कक्षाओं से परे, शायद आप RunningTotaliser इंजेक्ट नहीं करेंगे, क्योंकि यह एक ऐसी वस्तु है जो आपके लिए संख्याएं जोड़ती है।

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

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