2009-09-18 14 views
6

क्या .NET के कॉन्फ़िगरेशन API के साथ कॉन्फ़िगरेशन गुणों के रूप में अपरिवर्तनीय प्रकारों का उपयोग करना संभव है?विन्यास गुणों के रूप में अपरिवर्तनीय प्रकार

चलो कहते हैं कि मैं एक अपरिवर्तनीय प्रकार MyClass कहा जाता है दो:

public class ImmutableClass 
{ 
    private readonly int value; 

    public ImmutableClass(int value) 
    { 
     this.value = value; 
    } 

    public int Value 
    { 
     get { return this.value; } 
    } 
} 

मैं एक ConfigurationSection में एक विन्यास संपत्ति के रूप में इस प्रकार का उपयोग करना चाहते हैं:

public class MyConfigurationSection : ConfigurationSection 
{ 
    [ConfigurationProperty("foo")] 
    public ImmutableClass Foo 
    { 
     get { return (ImmutableClass)base["foo"]; } 
     set { base["foo"] = value; } 
    } 
} 

जब मैं ऐसा करते हैं, मैं यह कर सकते हैं MyConfigurationSection को व्यवस्थित और deserialize नहीं है क्योंकि यह इस अपवाद फेंकता है:

सिस्टम। कॉन्फिगुराटी पर। कॉन्फ़िगरेशनइरर्स अपवाद: संपत्ति 'मानदंड' का मान स्ट्रिंग में परिवर्तित नहीं किया जा सकता है। त्रुटि यह है: एक कनवर्टर खोजने में असमर्थ जो 'FindCriterion' प्रकार के गुण 'मानदंड' के लिए स्ट्रिंग से रूपांतरण/समर्थन का समर्थन करता है।

अगर मैं ConfigurationElement से ImmutableClass निकाले जाते हैं, मैं जब मैं क्रमानुसार और विन्यास खंड deserialize करने की कोशिश इस अपवाद प्राप्त करें:

System.Reflection.TargetInvocationException: अपवाद एक मंगलाचरण का लक्ष्य द्वारा दिया गया है । ---> System.Reflection.TargetInvocationException: अपवाद के लक्ष्य से अपवाद फेंक दिया गया है। ---> System.MissingMethodException: इस ऑब्जेक्ट के लिए परिभाषित कोई पैरामीटर रहित कन्स्ट्रक्टर नहीं है।

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

क्या कोई तरीका है कि मैं कॉन्फ़िगरेशन एपीआई में हुक कर सकता हूं ताकि इम्यूटेबल क्लास इस तरह से उपयोग किया जा सके?

उत्तर

1

आप प्रक्रिया के साथ मदद करने के लिए कुछ TypeConverters का उपयोग करने में सक्षम हो सकते हैं (System.Configurations.ConfigurationConverter से लिंक)।

असली सवाल यह है कि आप खुद को इतना परेशानी क्यों करना चाहते हैं? ऐसे कुछ समय हैं जहां वापस रखना और लड़ाई लड़ने से बेहतर रखना है। ढांचे के कुछ हिस्सों निराशाजनक हैं यदि आप इसे आपके लिए निर्धारित विशिष्ट किसी अन्य तरीके से अलग करने का प्रयास करते हैं ....

+0

+1। धन्यवाद, यह ठीक काम करता है। मैं मानता हूं कि ज्यादातर मामलों में, प्रवाह के साथ चलना आसान होगा, और यह भी मैं आमतौर पर करता हूं, लेकिन यह एक विशेष मामला था ... –

+0

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

4

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

+0

मैं ज्यादातर मामलों में सहमत हूं, और यह भी मैं आमतौर पर करता हूं, लेकिन यह एक विशेष मामला था। –

0

मैं उस अभिशाप को त्याग दूंगा क्योंकि विचार विफल होने के लिए शाप दिया गया है। सभी विन्यास अनुभाग हैंडलरों में एक डिफ़ॉल्ट (पैरामीटर रहित) कन्स्ट्रक्टर होना चाहिए। यह आपके अपरिवर्तनीय वस्तु के मामले में नहीं है।

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

मुझे यह कहना होगा कि कॉन्फ़िगरेशन अनुभागों का उपयोग किया जाना चाहिए। मुझे पता है कि एक राइट बैक विकल्प है लेकिन मैंने पहले कभी इसका इस्तेमाल नहीं किया है।

कोड निम्नलिखित की तरह कुछ दे सकता है:

विन्यास हैंडलर

public class SectionHandler : ConfigurationSection 
{ 
    [ConfigurationProperty("foo")] 
    public MyObject ConfigurationValue 
    { 
    get { return (MyObject) this["foo"]; } 
    } 
} 

के बाद आप एक्सएमएल फ़ाइल से बाहर है और एक वस्तु में उपभोग करने के लिए विन्यास प्रदाता पैटर्न का उपयोग विन्यास मूल्य मिल गया है आपके आवेदन में विन्यास।

विन्यास प्रदाता कुछ इस तरह दिखाई सकता है:

public MyConfigurationProvider : IMyconfigurationProvider 
{ 

    public MyImmutabble ConfigurationValue 
    { 
    get 
    { 
     var configurationvalue = (MyObject) ConfigurationManager.GetSection("mySection"); 
     return new MyImmutable(configurationvalue.ConfigurationValue); 
    } 
    } 
} 

यह मैं इसे कैसे करते हैं और यह मुझे अब तक सेवा की है है।

उम्मीद है कि यह मदद करता है।

+0

सामान्य मामलों में मैं आपसे पूरी तरह से सहमत हूं, और यह मेरा सामान्य दृष्टिकोण भी है, लेकिन यह एक विशेष मामला था। मैंने इसे विल द्वारा सुझाए गए टाइपकोनवर्ट्स के साथ काम किया है, और यह ठीक काम करता है, इसलिए आपका प्रारंभिक दावा सत्य नहीं है। –

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