2010-09-19 8 views
11

मान लें कि मेरे पास एक कॉन्फ़िगरेशन प्रॉपर्टी है जो इस तरह दिखती है। ध्यान दें कि कोई डिफ़ॉल्ट मान नहीं है।कॉन्फ़िगरेशन वैलिडेटर कॉन्फ़िगरेशनप्रॉपर्टी के डिफ़ॉल्ट मान को क्यों मान्य करता है भले ही IsRequired सत्य है?

[ConfigurationProperty("x", IsRequired = true)] 
[StringValidator(MinLength = 1)] 
public string X 
{ 
    get { return (string)this["x"]; } 
    set { this["x"] = value; } 
} 

अब मैं इस तरह मेरे अनुभाग जोड़ें:

The value for the property 'x' is not valid. The error is: The string must be at least 1 characters long.

यह काम करता है अगर मैं विन्यास संपत्ति को बदलने इस तरह एक डिफ़ॉल्ट शामिल करने के लिए:

<mySection x="123" /> 

मैं इस त्रुटि मिलेगी :

[ConfigurationProperty("x", DefaultValue="abc", IsRequired = true)] 
[StringValidator(MinLength = 1)] 
public string X 
{ 
    get { return (string)this["x"]; } 
    set { this["x"] = value; } 
} 

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

क्या यह सिर्फ खराब डिज़ाइन है या क्या इस व्यवहार के लिए कोई वैध कारण है?

उत्तर

6

मुझे इससे पहले समस्या थी। इसके लिए एक वैध कारण था लेकिन मुझे विवरण याद नहीं है।

मुझे याद नहीं है कि यह काम करता है लेकिन आप उस कंस्ट्रक्टर में संपत्ति घोषित करने का प्रयास कर सकते हैं जहां शून्य डिफ़ॉल्ट मान है।

public class CustomConfigurationSection : ConfigurationSection 
{ 
    public CustomConfigurationSection() 
    { 
     Properties.Add(new ConfigurationProperty(
      "x", 
      typeof(string), 
      null, 
      null, 
      new StringValidator(1), 
      ConfigurationPropertyOptions.IsRequired)); 
    } 


    public string X 
    { 
     get { return (string)this["x"]; } 
     set { this["x"] = value; } 
    } 
} 

यह डिफ़ॉल्ट मानों और वैधताओं का उपयोग करने से संबंधित है, लेकिन जहां डिफ़ॉल्ट मान चाहता है। http://msdn.microsoft.com/en-us/library/system.configuration.configurationproperty(VS.85).aspx#1

संपादित

मैं सिर्फ पिछले कोड बाहर की कोशिश की है और यह के रूप में मैं उम्मीद करता है। मेरा पिछला कोड संकलित नहीं हुआ क्योंकि मैंने एक कन्स्ट्रक्टर प्रॉपर्टी को याद किया था इसलिए मैंने इसे ठीक कर दिया है।

1

मेरी समझ के अनुसार, यह व्यवहार अत्यधिक आवश्यक है।

के बाद से विन्यास किसी भी आवेदन के कोर क्षेत्र में से एक है, और लगता है, कोई मूल्य नहीं एक आवेदन महत्वपूर्ण संपत्ति के लिए प्रदान की गई है, तो पूरी आवेदन कुछ अवांछित व्यवहार को जन्म दे सकती (एक दुर्घटना, अनिश्चितकालीन संसाधनों के उपयोग किया जा सकता है आदि)। मुझे लगता है कि यही कारण है, अधिकांश .NET इनबिल्ट कॉन्फ़िगरेशन गुण जैसे सत्र टाइमआउट इत्यादि को डिफ़ॉल्ट मान पर सेट किया गया था और वे लागू किए जाएंगे, यहां तक ​​कि उपयोगकर्ता ने मान निर्दिष्ट नहीं किया है।

+2

मुझे लगता है कि आप इस सवाल के बिंदु को याद कर चुके हैं। ओपी एक विन्यास "आवश्यक" विन्यास संपत्ति बनाने की कोशिश कर रहा है और इसलिए डिफ़ॉल्ट मान की आवश्यकता नहीं है। कॉन्फ़िगरेशन फ्रेमवर्क गुणों को तार करने के लिए विशेषताओं का उपयोग करते समय आपको ऐसा करने की अनुमति नहीं देता है। – Bronumski

2

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

हालांकि, DefaultValue इस मामले में लागू होता है, के रूप में यह जब संपत्ति एक्सएमएल से deserialized किया जा रहा है (किसी भी ConfigurationValidatorAttribute करता है) करता है।

यह समझ में आता है कि आप इकाई परीक्षण में कॉन्फ़िगरेशन अनुभाग का उपयोग कर रहे हैं। यह वास्तव में अच्छा है ए) अनुभाग और बी का निर्माण करते समय एक घोषणात्मक डिफ़ॉल्ट मान है) डिफ़ॉल्ट मान मान्य है।

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

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