Почему конфигурацияVALIDATOR подтверждает значение по умолчанию ConfigurationProPerty, даже если ISREQUIDED верно?

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

Это подразумевает, что Validator подтверждает значение по умолчанию, даже если Isrequired является верным. Это также означает, что я должен включать в себя фиктивные значения по умолчанию по всем моим свойствам, чтобы пройти проверку, даже если они на самом деле не будут использоваться.

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

Это было полезно?

Решение

У меня была эта проблема раньше. Была действительная причина для этого, но я не могу вспомнить детали.

Я не могу вспомнить, если это работает, но вы можете попробовать объявить свойство в конструкторе, где 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).

Это имеет смысл, если вы используете разделы конфигурации в модульном тестировании. Очень приятно) иметь декларативное значение по умолчанию при построении раздела и B) иметь значение значения по умолчанию.

Согласно моему пониманию, это поведение крайне требуется.

Поскольку конфигурация является одной из основных областей любого приложения и предполагает, что значение не предусмотрено значение критическим свойством приложения, то все приложение может привести к некоторому нежеланию поведения (может быть сбой, неопределенный утилизация ресурсов и т. Д.). Я думаю, что это причина, большинство свойств конфигурации конфигурации .Net, такие как время ожидания сеанса и т. Д., Было установлено значение по умолчанию, и они будут применены, даже пользователь не указал значение.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top