2011-08-15 20 views
6

मैं विरासत कोड पर काम कर रहा हूं।स्ट्रक्चर मैप स्पष्ट कन्स्ट्रक्टर तर्क निर्दिष्ट करना

मेरे पास एक ही वर्ग के विभिन्न तरीके हैं जो निर्भरता के निर्माता को विभिन्न तर्क देते हैं। मैं कुछ बुनियादी आईओसी उपयोग शुरू करने की कोशिश कर रहा हूं।

var thing = ObjectFactory.GetInstance<IThingInterface>(new ExplicitArguments(
     new Dictionary<string, object> { 
      { "constructorArgA", notShown }, 
      { "constructorArgB", redacted.Property } })); 

कहाँ वास्तविक गुण constructorArgA और बी बदलाव के लिए पारित कर दिया पर मैं कहाँ हूँ निर्भर करता है: अभी मैं StructureMap इस तरह मेरे तर्क गुजर की है।

x.For<IHidden>().Use<RealType>() 
    .Ctor<IConfig>().Is(new Func<IContext, IConfig>(
     (context) => someMethodToGetIConfig())); 

अगर मैं खरोंच से इस लिख रहे थे मैं संरचना शायद चाहते हैं:

"constructorArgA" के बजाय

वहाँ वास्तविक प्रकार के माध्यम से इस कॉन्फ़िगर करने के लिए, की तरह आप जब objectFactory को विन्यस्त, की तरह कर सकते हैं एक तरीका है इस से बचने के लिए निर्भरता थोड़ा अलग है, लेकिन यह अभी मेरे लिए एक विकल्प नहीं है।

+0

या मुझे कन्स्ट्रक्टर इंजेक्शन के बजाय प्रॉपर्टी इंजेक्शन पर स्विच करना चाहिए? –

उत्तर

3

यह DI कंटेनर के साथ क्लासिक/सामान्य प्रश्न है।

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

दूसरा विकल्प एक अमूर्त कारखाना बनाना होगा जो वास्तव में कंटेनर का उपयोग/लपेटता है। तो मूल रूप से आपका पहला कोड स्निपेट लेकिन फ़ैक्टरी क्लास में लपेटा गया है जहां बनाएं() विधि आपके पैरामीटर लेती है। इसमें सब कुछ का लाभ है (आपके कार्यान्वयन और इसकी निर्भरताओं सहित) कंटेनर-प्रबंधित होने के नाते, लेकिन सीधे आपके कंटेनर को संदर्भित करने का नुकसान (जो सबसे अच्छा अभ्यास नहीं है - Article on Composition Roots देखें)।

आप सेटर इंजेक्शन भी कर सकते हैं, लेकिन मैं व्यक्तिगत रूप से इसे अंतिम उपाय मानता हूं।

कैसल विंडसर में इस समस्या का एक अच्छा समाधान है (Typed Factory Facility)। सुनिश्चित नहीं है कि एक विकल्प में कंटेनर स्विच करना, लेकिन आप इसे मान सकते हैं।

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