为什么configurationValidator即使iSquired是true,configurationValidator即使configurationProperty的默认值?
-
04-10-2019 - |
题
假设我有一个看起来像这样的配置属性。请注意,没有默认值。
[ConfigurationProperty("x", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
get { return (string)this["x"]; }
set { this["x"] = value; }
}
现在我添加这样的部分:
<mySection x="123" />
我会得到这个错误:
属性“ x”的值无效。错误是:字符串必须至少长1个字符。
如果我将配置属性更改为包括这样的默认值,它可以正常工作:
[ConfigurationProperty("x", DefaultValue="abc", IsRequired = true)]
[StringValidator(MinLength = 1)]
public string X
{
get { return (string)this["x"]; }
set { this["x"] = value; }
}
这意味着验证器即使iSquired是正确的,验证器也会验证默认值。这也意味着我必须在所有属性上包含一个虚拟默认值,即使实际上不使用它们,也必须通过验证。
这只是不良的设计还是有正当的理由?
解决方案
我以前有这个问题。有一个正当的理由,但我不记得细节。
我不记得这是否有效,但是您可以尝试在构造函数中声明null为默认值的属性。
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
编辑
我刚刚尝试了以前的代码,它确实是我预期的。我以前的代码没有编译,因为我错过了构造函数属性,因此我已经解决了。
其他提示
原因是可以在不存在配置文件的情况下将“配置部分”类在代码中启动。您可以使用默认构造函数,也不能指定属性的任何值。在这种情况下,即使您已经指定了 IsRequired=true
没有例外。换句话说, IsRequired
仅当属性从XML进行典范时才适用。
然而, DefaultValue
做 在这种情况下,申请,就像从XML中对属性进行典范时所做的那样(就像任何 ConfigurationValidatorAttribute
).
如果您在单元测试中使用配置部分,这是有道理的。 a)在构造本节时具有声明性默认值和b)已验证默认值时具有声明性默认值。
根据我的理解,这种行为是高度必要的。
由于配置是任何应用程序的核心区域之一,并假设没有为关键属性提供值的值,因此整个应用程序可能会导致某些不必要的行为(可能是崩溃,无限期的资源利用等)。我认为这就是原因,大多数.NET内置配置属性(例如会话超时等)设置为默认值,即使用户也未指定值,它们也将应用它们。