2011-05-04 9 views
5

मेरे पास एक डब्ल्यूसीएफ सेवा है जिसमें कुछ अलग जिम्मेदारियां हैं, लेकिन यह मेरे कोड के साथ बातचीत करने वाले किसी के लिए एक प्रविष्टि बिंदु प्रदान करता है। यह सरल रखने के लिए, चलो वहाँ 2 तरीकोंआईओसी कंटेनर - डब्ल्यूसीएफ सेवा - क्या मुझे कन्स्ट्रक्टर के माध्यम से सभी निर्भरताओं को तुरंत चालू करना चाहिए?

private IMethodAHelper _methodA; 
    private IMethodBHelper _methodB; 

    public MyService(IMethodAHelper methodA, IMethodBHelper methodB) 
    { 
     _methodA = methodA; 
     _methodB = methodB; 
    } 

    public void MethodA() { 
     _methodA.CallThis(); 
    } 

    public void MethodB() { 
     _methodB.CallThis(); 
    } 

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

एक और तरीका है मैं ऐसा करने का सोच रहा था

public void MethodA() { 
     var methodA = ObjectFactory.GetInstance<IMethodAHelper>(); 
     methodA.CallThis(); 
    } 

यह निर्भरता इसकी आवश्यकता को लाने के लिए प्रत्येक "पथ" की अनुमति देता है की तरह कुछ हो सकता है, तथापि, यह एक बहुत कठिन इकाई परीक्षण लिखने के लिए बनाता है। क्या किसी के पास कोई सुझाव है? सभी निर्भरताओं को फैलाने के लिए कितना बड़ा मुद्दा है? सेवा में इस पहले प्रवेश बिंदु के बाद, यह कन्स्ट्रक्टर के माध्यम से निर्भरताओं को इंजेक्ट करने के लिए समझ में आता है, लेकिन इस पहले प्रविष्टि बिंदु पर, अनुशंसित दृष्टिकोण क्या है?

उत्तर

2

मार्क साइस के रूप में आपको उन निर्भरताओं को बनाने के बारे में चिंता नहीं करना चाहिए जिनका उपयोग तब तक नहीं किया जाता जब तक कि आपके पास कुछ वास्तविक प्रोफेसर (प्रोफाइलर से समय) नहीं होते हैं, जिससे वे महंगे होते हैं। यदि आपके पास घटकों को बनाने के लिए कुछ महंगा है तो आप एक कंटेनर का उपयोग करना चाहेंगे जो आलसी इंजेक्शन का समर्थन करता है जैसे AutoFac। इस तरह आप आलसी इंजेक्शन कर सकते हैं जिसे केवल पहले उपयोग पर बनाया जाएगा।

1

मुझे आपके द्वारा किए जा रहे कार्यों के बारे में जानकारी नहीं है, लेकिन यह अलग-अलग सेवाओं में उन्हें तोड़ने के लिए और अधिक समझदारी हो सकती है।

2

निर्भरता इंजेक्शन के लिए अंगूठे का एक सामान्य नियम यह है कि सभी (आवश्यक) निर्भरताओं को एक वर्ग को ठीक से काम करने की आवश्यकता होती है जिसे कन्स्ट्रक्टर इंजेक्शन के माध्यम से इंजेक्शन दिया जाना चाहिए।

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

वैसे भी मैं मार्क सेमैन के उत्तर से सहमत हूं।

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

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