Почему ConfigurationValidator проверяет значение по умолчанию для ConfigurationProperty, даже если IsRequired имеет значение true?
Допустим, у меня есть свойство конфигурации, которое выглядит следующим образом. Обратите внимание, что значение по умолчанию отсутствует.
[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 имеет значение true. Это также означает, что я должен включить фиктивные значения по умолчанию во все мои свойства, чтобы пройти проверку, даже если они фактически не будут использоваться.
Это просто плохой дизайн или есть веская причина для такого поведения?
3 ответа
У меня была эта проблема раньше. Для этого была веская причина, но я не могу вспомнить детали.
Я не могу вспомнить, работает ли это, но вы можете попробовать объявить свойство в конструкторе, где 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
РЕДАКТИРОВАТЬ
Я только что опробовал предыдущий код, и он делает, как я ожидал. Мой предыдущий код не компилировался, так как я пропустил свойство конструктора, поэтому я исправил это.
Причина в том, что классы раздела конфигурации могут быть обновлены в коде без файла конфигурации. Вы можете использовать конструктор по умолчанию и не указывать никаких значений для свойства. В этом случае, даже если вы указали IsRequired=true
здесь нет исключений. Другими словами, IsRequired
применяется только в том случае, если свойство десериализовано из XML.
Тем не мение, DefaultValue
применяется в этом случае, как и в случае десериализации свойства из XML (как и любой ConfigurationValidatorAttribute
).
Это имеет смысл, если вы используете разделы конфигурации в модульном тестировании. Это действительно хорошо, если A) иметь декларативное значение по умолчанию при построении раздела и B) иметь значение по умолчанию, проверенное.
Насколько я понимаю, это поведение крайне необходимо.
Поскольку конфигурация является одной из основных областей любого приложения, и предположим, что не было предоставлено значение для критического свойства приложения, тогда все приложение может привести к некоторому нежелательному поведению (это может быть сбой, неопределенное использование ресурсов и т. Д.). Я думаю, что по этой причине большинство встроенных свойств конфигурации.Net, таких как время ожидания сеанса и т. Д., Были установлены в значение по умолчанию, и они будут применяться, даже если пользователь не указал значение.
Как было сказано ранее, это не помогает в получении проверки без указания значения по умолчанию для свойства, что делает свойство IsRequired свойства ConfigurationPropertyAttribute бесполезным.