2010-04-03 15 views
8

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

यह महान काम किया, और इस तरह से संरचित अच्छा कक्षाएं प्राप्त होते हैं:

public class CheckTranslator : ICheckTranslator 
{ 
    public CheckTranslator (IEmployeeService empSvc 
         , IPaycheckService paySvc) 
    { 
     _empSvc = empSvc; 
     _paySvc = paySvc; 
    } 

    public Check CreateCheck() 
    { 
     //do the translation... 
    } 
} 

कई अलग अलग समूह विकल्प हालांकि, कुछ मामलों में मानचित्रण है। नतीजतन, सी-टोर वर्ग निर्भरताओं और मानकों के मिश्रण में बदल जाएगा।

public class CheckTranslator : ICheckTranslator 
{ 
    public CheckTranslator (IEmployeeService empSvc 
         , IPaycheckService paySvc 
         , bool doTranslateStubData 
         , bool doAttachLogo) 
    { 
     _empSvc = empSvc; 
     _paySvc = paySvc; 
     _doTranslateStubData = doTranslateStubData; 
     _doAttachLogo = doAttachLogo; 
    } 

    public Check CreateCheck() 
    { 
     //do the translation... 
    } 
} 

अब, हम अभी भी इसका परीक्षण कर सकते हैं, लेकिन यह वास्तव में कम से कम एक स्वच्छ फैशन में आईओसी कंटेनर के साथ काम नहीं करता है। इसके अलावा, यदि हम प्रत्येक चेक के लिए सेटिंग्स अलग हैं तो हम अब CreateCheck को दो बार कॉल नहीं कर सकते हैं।

जबकि मुझे पता है कि यह एक समस्या है, मुझे जरूरी सही समाधान नहीं दिखता है। यह प्रत्येक वर्ग के लिए फैक्ट्री बनाने के लिए अजीब लगता है ... या यह सबसे अच्छा तरीका है?

+0

क्या आप "आईओसी कंटेनर के साथ वास्तव में काम नहीं करते" पर विस्तार कर सकते हैं? आप किस कंटेनर का उपयोग कर रहे हैं? –

+1

किसी भी तरह मैं निर्भरता इंजेक्शन के चमत्कारों को समझने में विफल रहता हूं और यह अपने स्वयं के फैंसी नाम के साथ एक पैटर्न भी क्यों है। बूल पैरामीटर को गुणों में बदलने से आपको क्या रोकता है? –

+2

@ हैमिश: वे कन्स्ट्रक्टर पैरामीटर हैं क्योंकि वे अनिवार्य हैं। उन्हें कन्स्ट्रक्टर में रखने से यह लागू होता है कि वे घटक का उपयोग करने से पहले स्पष्ट रूप से सेट हैं। –

उत्तर

13

यहां अंधेरे में गोली मार दी, लेकिन क्या आप उन पैरामीटर को विधि में ले जा सकते हैं?

दूसरे शब्दों में:

public Check CreateCheck(bool doTranslateStubData, bool doAttachLogo) 
{ 
    //do the translation... 
} 

उन पैरामीटर है निर्माता के माध्यम से पास होने के लिए है?

(नोट - यदि आपकी प्रतिक्रिया यह है कि "व्यावहारिक होने के लिए बहुत सारी विधियां हैं", तो समस्या का हिस्सा यह हो सकता है कि अमूर्तता बहुत मोटा हो)।


एक अन्य विकल्प (यह डोमेन मॉडल और इंजेक्शन पैटर्न को समझे बिना कहने के लिए बहुत मुश्किल है) एक पैरामीटर वस्तु है जो अपने आप इंजेक्टर द्वारा प्रबंधित लागू करने के लिए होगा:

public interface ICheckConfiguration 
{ 
    bool AttachLogo { get; } 
    bool TranslateStubData { get; } 
} 

फिर इस इंजेक्षन निर्माता के साथ:

public CheckTranslator (IEmployeeService empSvc, IPaycheckService paySvc, 
    ICheckConfiguration config) 
{ 
    // etc. 
} 

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


आखिरी बात मुझे लगता है कि मैं उल्लेख करना चाहिए सिर्फ इसलिए कि आप डि उपयोग कर रहे हैं इसका मतलब यह नहीं है कि सब कुछ है कंटेनर द्वारा प्रबंधित किया जा रहा है। CheckTranslator ऑब्जेक्ट्स को विज्ञापन-प्रसार फैशन में बनाने के लिए ऐसी कोई बुरी बात नहीं है यदि केवल एक ही प्रकार का "अनुवादक" है। जब तक अनुवादक अभी भी अबास्ट्रक्शंस पर निर्भर करता है, जो यह यहां करता है, तो हो सकता है कि आपको इसे इंजेक्शन नहीं देना चाहिए, बस उच्च-स्तरीय डी-सक्षम कक्षाएं उन्हें विज्ञापन-प्रसार दें।

+0

मैं अभी अपना जवाब फिर से संपादित करने के लिए बहुत थक गया हूं लेकिन एक और संभावना है, जो सार फैक्टरी पैटर्न का उपयोग करना है और '[I] CheckTranslatorFactory' इंजेक्ट करना है। पैरामीटर के साथ, अज्ञात कंक्रीट प्रकार की 'चेकट्रांसलेटर' या 'आईसीहेकट्रांसलेटर' ऑब्जेक्ट्स बनाने का यह एक वैध तरीका होगा; वास्तविक अनुवादक उदाहरण को इंजेक्ट करने के बजाय, आप कारखाने को इंजेक्ट करते हैं, और अलग-अलग अनुवादक उपप्रकार बनाने के लिए जिम्मेदार विभिन्न कारखानों को रखते हैं। यदि आप 'चेकट्रांसलेटर' के लिए बहुरूपता का उपयोग करना चाहते हैं तो केवल वास्तव में आवश्यक/उपयोगी। – Aaronaught

+0

आईसीएचक कॉन्फ़िगरेशन का उपयोग करना एक अच्छा विचार है। डिफ़ॉल्ट मामले के लिए एक नल पैटर्न कार्यान्वयन में पास करें, और अन्य मामलों के लिए एक वास्तविक कार्यान्वयन में पास करें। –

+0

समझ में आता है। धन्यवाद! – Andrew

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