【问题标题】:Why does ConfigurationValidator validate the default value of a ConfigurationProperty even if IsRequired is true?为什么即使 IsRequired 为真,ConfigurationValidator 也会验证 ConfigurationProperty 的默认值?
【发布时间】:2011-04-14 06:47:48
【问题描述】:

假设我有一个如下所示的配置属性。请注意,没有默认值。

[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; }
}

这意味着即使 IsRequired 为真,验证器也会验证默认值。这也意味着我必须在我的所有属性上包含一个虚拟默认值才能通过验证,即使它们实际上不会被使用。

这只是糟糕的设计还是这种行为有正当理由?

【问题讨论】:

    标签: c# .net system.configuration


    【解决方案1】:

    我以前也遇到过这个问题。这是有正当理由的,但我不记得细节了。

    我不记得这是否可行,但您可以尝试在构造函数中声明属性,其中 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

    编辑

    我刚刚尝试了之前的代码,它按我的预期运行。我之前的代码没有编译,因为我错过了一个构造函数属性,所以我已经修复了。

    【讨论】:

      【解决方案2】:

      原因是配置节类可以在没有配置文件的情况下在代码中更新。您可以使用默认构造函数而不为该属性指定任何值。在这种情况下,即使您指定了IsRequired=true,也不会抛出异常。换言之,IsRequired 仅适用于从 XML 反序列化属性的情况。

      但是,DefaultValue 确实适用于这种情况,就像从 XML 反序列化属性时一样(任何ConfigurationValidatorAttribute 也是如此)。

      如果您在单元测试中使用配置部分,这很有意义。 A)在构造部分时有一个声明性的默认值,B)有一个验证的默认值,这真的很好。

      【讨论】:

        【解决方案3】:

        据我了解,这种行为是非常必要的。

        由于配置是任何应用程序的核心区域之一,并且假设没有为应用程序的关键属性提供任何值,那么整个应用程序可能会导致一些不良行为(可能是崩溃、无限资源利用等) )。我认为这就是原因,大多数 .Net 内置配置属性(如会话超时等)都设置为默认值,即使用户没有指定值,它们也会被应用。

        【讨论】:

        • 我认为你错过了问题的重点。 OP 正在尝试创建配置“必需”配置属性,因此不需要默认值。在使用属性连接属性时,配置框架不允许您这样做。
        【解决方案4】:

        如前所述,这无助于在无需为属性指定默认值的情况下获得验证,从而使 ConfigurationPropertyAttribute 的 IsRequired 属性无用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-01-20
          • 2012-10-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多