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

голоса
59

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

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

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

Задан 05/08/2008 в 13:13
источник пользователем
На других языках...                            


6 ответов

голоса
74

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

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

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

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;
}
Ответил 05/08/2008 d 23:17
источник пользователем

голоса
11

Quick'n Грязные:

Сначала создать 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);
}
Ответил 05/08/2008 d 13:51
источник пользователем

голоса
4

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

Ответил 19/09/2013 d 16:39
источник пользователем

голоса
3

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

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

Ответил 13/02/2009 d 14:45
источник пользователем

голоса
2

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

Ответил 05/08/2008 d 13:25
источник пользователем

голоса
1

Самый простой способ, который я нашел, использует раздел AppSettings .

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

    <appSettings>
        <add key="MyProp" value="MyVal"/>
    </appSettings>
    

  2. Доступ из кода

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

Ответил 04/02/2017 d 17:59
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more