为什么configurationValidator即使iSquired是true,configurationValidator即使configurationProperty的默认值?

StackOverflow https://stackoverflow.com/questions/3744953

  •  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内置配置属性(例如会话超时等)设置为默认值,即使用户也未指定值,它们也将应用它们。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top