Использование атрибутов, дочерних разделов конфигурации и ограничений
Существует также возможность использовать атрибуты, которые автоматически заботятся о сантехнике, а также предоставляют возможность легко добавлять ограничения.
Я привожу пример из кода, который я использую на одном из моих сайтов. С ограничением я определяю максимальный объем дискового пространства, который может использовать один пользователь.
MailCenterConfiguration.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 mail создается в том же файле .cs, что и предыдущий. Здесь я добавил ограничения на порт. Если порту присвоено значение, не входящее в этот диапазон, среда выполнения будет выдавать жалобу при загрузке конфигурации.
MailCenterConfiguration.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.
MailCenterConfiguration.cs
private static MailCenterConfiguration instance = null;
public static MailCenterConfiguration Instance
{
get
{
if (instance == null)
{
instance = (MailCenterConfiguration)WebConfigurationManager.GetSection("mailCenter");
}
return instance;
}
}
AnotherFile.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;
}