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


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

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

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

6 61

6 ответов:

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

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

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

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.конфиг вроде так

<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, это будет автоматически читать соответствующие разделы в интернете.конфиг.

MailCenterConfiguration.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.цезий.) Я, как правило, хочу знать эти вещи как можно скорее, когда мой сайт загорается. Один из способов решить эту проблему-загрузить конфигурацию в _Global.asax.cx.Application_Start_ , если конфигурация недействительна, вы будете уведомлены об этом с помощью исключения. Ваш сайт не запустится и вместо этого вам будет представлено подробное исключение информация в желтый экран смерти.

глобальные.асакс.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}

быстрая Эн грязные:

сначала создайте свой 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.конфигурации:

<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 для пользовательских разделов в интернете.конфигурация, которая содержит список элементов конфигурации.

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

для .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 однако это относится к приложению.конфигурация, которая была бы почти такой же, как написание одного для использования в интернете.конфиг. Это позволит вам по существу иметь свое собственное XML-дерево в файле конфигурации и выполнять некоторые более сложные настройки.

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

  1. добавить в web.сконфигурируйте следующее:

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

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