Как мне определить пользовательские разделы web.config с потенциальными дочерними элементами и атрибутами для свойств?
-
08-06-2019 - |
Вопрос
Веб-приложения, которые я разрабатываю, часто требуют взаимозависимых параметров конфигурации, и есть также параметры, которые должны меняться по мере перехода из одной среды в другую.
Все наши настройки в настоящее время представляют собой простые пары ключ-значение, но было бы полезно создать пользовательские разделы конфигурации, чтобы было очевидно, когда два значения необходимо изменить вместе или когда настройки необходимо изменить для среды.
Каков наилучший способ создания пользовательских разделов конфигурации и есть ли какие-либо особые соображения при извлечении значений?
Решение
Использование атрибутов, дочерних разделов конфигурации и ограничений
Существует также возможность использовать атрибуты, которые автоматически заботятся о сантехнике, а также предоставляют возможность легко добавлять ограничения.
Здесь я привожу пример из кода, который я сам использую на одном из своих сайтов.С ограничением я диктую максимальный объем дискового пространства, который может использовать любой пользователь.
Почтовый центрконфигурации.cs:
namespace Ani {
public sealed class MailCenterConfiguration : ConfigurationSection
{
[ConfigurationProperty("userDiskSpace", IsRequired = true)]
[IntegerValidator(MinValue = 0, MaxValue = 1000000)]
public int UserDiskSpace
{
get { return (int)base["userDiskSpace"]; }
set { base["userDiskSpace"] = value; }
}
}
}
Это настроено в web.config следующим образом
<configSections>
<!-- Mailcenter configuration file -->
<section name="mailCenter" type="Ani.MailCenterConfiguration" requirePermission="false"/>
</configSections>
...
<mailCenter userDiskSpace="25000">
<mail
host="my.hostname.com"
port="366" />
</mailCenter>
Дочерние элементы
Дочерний xml-элемент Почта создается в том же файле .cs, что и приведенный выше.Здесь я добавил ограничения на порт.Если порту присвоено значение, не входящее в этот диапазон, среда выполнения подаст жалобу при загрузке конфигурации.
Почтовый центрконфигурации.cs:
public sealed class MailCenterConfiguration : ConfigurationSection
{
[ConfigurationProperty("mail", IsRequired=true)]
public MailElement Mail
{
get { return (MailElement)base["mail"]; }
set { base["mail"] = value; }
}
public class MailElement : ConfigurationElement
{
[ConfigurationProperty("host", IsRequired = true)]
public string Host
{
get { return (string)base["host"]; }
set { base["host"] = value; }
}
[ConfigurationProperty("port", IsRequired = true)]
[IntegerValidator(MinValue = 0, MaxValue = 65535)]
public int Port
{
get { return (int)base["port"]; }
set { base["port"] = value; }
}
Использование
Чтобы затем использовать его практически в коде, все, что вам нужно сделать, это создать экземпляр MailCenterConfigurationObject, это позволит автоматически прочтите соответствующие разделы в web.config.
Почтовый центрконфигурации.cs
private static MailCenterConfiguration instance = null;
public static MailCenterConfiguration Instance
{
get
{
if (instance == null)
{
instance = (MailCenterConfiguration)WebConfigurationManager.GetSection("mailCenter");
}
return instance;
}
}
Другой файл.cs
public void SendMail()
{
MailCenterConfiguration conf = MailCenterConfiguration.Instance;
SmtpClient smtpClient = new SmtpClient(conf.Mail.Host, conf.Mail.Port);
}
Проверка на достоверность
Ранее я упоминал, что среда выполнения будет жаловаться, когда конфигурация загружена и некоторые данные не соответствуют установленным вами правилам (напримерв файле MailCenterConfiguration.cs).Как правило, я хочу узнать об этих вещах как можно скорее, когда мой сайт запустится.Один из способов решить эту проблему - загрузить конфигурацию в _Global.asax.cx.Application_Start_ , если конфигурация недействительна, вы будете уведомлены об этом с помощью исключения.Ваш сайт не запустится, и вместо этого вам будет представлена подробная информация об исключениях в Желтый экран смерти.
Global.asax.cs
protected void Application_ Start(object sender, EventArgs e)
{
MailCenterConfiguration.Instance;
}
Другие советы
Быстрый и Грязный:
Сначала создайте свой Конфигурационный раздел и Конфигурацияэлемент классы:
public class MyStuffSection : ConfigurationSection
{
ConfigurationProperty _MyStuffElement;
public MyStuffSection()
{
_MyStuffElement = new ConfigurationProperty("MyStuff", typeof(MyStuffElement), null);
this.Properties.Add(_MyStuffElement);
}
public MyStuffElement MyStuff
{
get
{
return this[_MyStuffElement] as MyStuffElement;
}
}
}
public class MyStuffElement : ConfigurationElement
{
ConfigurationProperty _SomeStuff;
public MyStuffElement()
{
_SomeStuff = new ConfigurationProperty("SomeStuff", typeof(string), "<UNDEFINED>");
this.Properties.Add(_SomeStuff);
}
public string SomeStuff
{
get
{
return (String)this[_SomeStuff];
}
}
}
Затем сообщите фреймворку, как обрабатывать ваши классы конфигурации в web.config:
<configuration>
<configSections>
<section name="MyStuffSection" type="MyWeb.Configuration.MyStuffSection" />
</configSections>
...
И на самом деле добавьте свой собственный раздел ниже:
<MyStuffSection>
<MyStuff SomeStuff="Hey There!" />
</MyStuffSection>
Затем вы можете использовать это в своем коде таким образом:
MyWeb.Configuration.MyStuffSection configSection = ConfigurationManager.GetSection("MyStuffSection") as MyWeb.Configuration.MyStuffSection;
if (configSection != null && configSection.MyStuff != null)
{
Response.Write(configSection.MyStuff.SomeStuff);
}
Там есть отличный пример в MSDN используя ConfigurationCollection
и .NET 4.5 для пользовательских разделов в web.config, в котором есть список элементов конфигурации.
Пользовательская конфигурация - довольно удобная вещь, и часто приложения сталкиваются с потребностью в расширяемом решении.
Для получения информации о .NET 1.1, пожалуйста, обратитесь к статье http://aspnet .4guysfromrolla.com/articles/020707-1.aspx
Примечание:Приведенное выше решение также работает для .NET 2.0.
Для получения информации о конкретном решении для .NET 2.0, пожалуйста, обратитесь к статье http://aspnet .4guysfromrolla.com/articles/032807-1.aspx
Вы можете сделать это с помощью обработчиков разделов.Существует общий обзор того, как его написать, по адресу http://www.codeproject.com/KB/aspnet/ConfigSections.aspx однако это относится к app.config, что было бы практически то же самое, что написать его для использования в web.config.Это позволит вам, по сути, иметь свое собственное XML-дерево в конфигурационном файле и выполнить более сложную настройку.
Самый простой метод, который я нашел, - это использование Раздел настроек приложений.
Добавьте в Web.config следующее:
<appSettings> <add key="MyProp" value="MyVal"/> </appSettings>
Доступ из вашего кода
NameValueCollection appSettings = ConfigurationManager.AppSettings; string myPropVal = appSettings["MyProp"];