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

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

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

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

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
68
0
43 057
6
Перейти к ответу Данный вопрос помечен как решенный

Ответы 6

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

Quick'n Dirty:

Сначала создайте классы Конфигурация Раздел и 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);
}
Ответ принят как подходящий

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

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

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

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-элемент Почта создается в том же файле .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;
}

Как бы вы изменили код, если ожидаете несколько дочерние элементы?

Kevin Le - Khnle 31.01.2011 21:05

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

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

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

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

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

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

    NameValueCollection appSettings = ConfigurationManager.AppSettings;
    string myPropVal = appSettings["MyProp"];
    

Другие вопросы по теме