Подтвердить что ты не робот

Почему ConfigurationValidator проверяет значение по умолчанию для ConfigurationProperty, даже если IsRequired является истинным?

Скажем, у меня есть свойство конфигурации, которое выглядит так. Обратите внимание, что значение по умолчанию отсутствует.

[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 истинно. Это также означает, что я должен включать фиктивные значения по умолчанию для всех моих свойств, чтобы пройти проверку, даже если они фактически не будут использоваться.

Это просто плохой дизайн или есть веская причина такого поведения?

4b9b3361

Ответ 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, таких как Session timeout и т.д., Были установлены на значение по умолчанию, и они будут применяться, даже если пользователь не указал значение.