Как определить пользовательские разделы web.config с потенциальными дочерними элементами и атрибутами для свойств? - PullRequest
64 голосов
/ 05 августа 2008

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

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

Каков наилучший способ создания пользовательских разделов конфигурации, и есть ли какие-то особые соображения, которые следует учитывать при извлечении значений?

Ответы [ 6 ]

78 голосов
/ 06 августа 2008

Использование атрибутов, дочерних разделов конфигурации и ограничений

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

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

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;
}
12 голосов
/ 05 августа 2008

Quick'n Dirty:

Сначала создайте ConfigurationSection и ConfigurationElement классов:

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);
}
5 голосов
/ 19 сентября 2013

Отличный пример для MSDN с использованием ConfigurationCollection и .NET 4.5 для пользовательских разделов в web.config со списком элементов конфигурации.

4 голосов
/ 13 февраля 2009

Настраиваемая конфигурация довольно удобная вещь, и часто приложениям приходится требовать расширяемого решения.

Для .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

3 голосов
/ 05 августа 2008

Вы можете сделать это с помощью обработчиков разделов. Существует базовый обзор того, как написать один на http://www.codeproject.com/KB/aspnet/ConfigSections.aspx, однако он относится к app.config, который будет почти таким же, как написание для использования в web.config Это позволит вам по существу иметь свое собственное дерево XML в файле конфигурации и выполнить некоторые более сложные настройки.

2 голосов
/ 04 февраля 2017

Самый простой метод, который я нашел, это использование appSettings section .

  1. Добавьте в Web.config следующее:

    <code><appSettings>
        <add key="MyProp" value="MyVal"/>
    </appSettings>
    
  2. Доступ с вашего кода

    <code>NameValueCollection appSettings = ConfigurationManager.AppSettings;
    string myPropVal = appSettings["MyProp"];
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...