Como posso definir web personalizado.secções de configuração com o potencial da criança para elementos e atributos para as propriedades?

StackOverflow https://stackoverflow.com/questions/2155

  •  08-06-2019
  •  | 
  •  

Pergunta

Os aplicativos da web desenvolvo muitas vezes exigem co-dependentes de definições de configuração, e também há configurações que têm de mudar, como nós nos movemos entre cada um dos nossos ambientes.

Todas as nossas configurações, são actualmente simples pares de valores de chave, mas seria útil para criar personalizado secções de configuração, de modo que é óbvio quando dois valores necessidade de mudança, em conjunto ou quando as definições necessidade de mudança para um ambiente.

Qual é a melhor maneira para criar personalizado secções de configuração e existem considerações especiais para fazer ao recuperar os valores?

Foi útil?

Solução

Usando atributos, filho secções de configuração e restrições

Há também a possibilidade de usar os atributos que encarrega-se automaticamente o encanamento, bem como fornecer a capacidade de facilmente adicionar restrições.

Eu aqui apresentar um exemplo de código que eu uso-me em um dos meus sites.Com uma restrição que eu ditar a quantidade máxima de espaço em disco qualquer usuário é permitido o uso.

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; }
        }
    }
}

Isso é configurado na web.config assim

<configSections>
    <!-- Mailcenter configuration file -->
    <section name="mailCenter" type="Ani.MailCenterConfiguration" requirePermission="false"/>
</configSections>
...
<mailCenter userDiskSpace="25000">
    <mail
     host="my.hostname.com"
     port="366" />
</mailCenter>

Elementos filho

A criança elemento xml correio é criado na mesma .cs arquivo como o descrito acima.Aqui eu adicionei restrições na porta.Se a porta é atribuído um valor não neste intervalo o tempo de execução vai reclamar quando a configuração é carregado.

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; }
        }

Utilização

Para, em seguida, usá-lo praticamente em código, tudo que você tem a fazer é instanciar a MailCenterConfigurationObject, este será automaticamente leia as secções relevantes da 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);
}

Verificação da validade

Já foi mencionado anteriormente que o tempo de execução vai reclamar quando a configuração é carregado e alguns dados não respeitem as regras de você ter configurado (por exemplo,em MailCenterConfiguration.cs).Eu tendem a querer saber dessas coisas assim que possível quando o meu site é acionado para cima.Uma maneira de resolver isso é carregar a configuração no _Global.asax.cx.Application_Start_ , se a configuração é inválida você será notificado sobre isso com os meios de uma exceção.Seu website não iniciar e, em vez disso, você será apresentado detalhadas informações de exceção no Amarelo tela de morte.

Globais.asax.cs

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

Outras dicas

Quick and Dirty:

Primeiro crie a sua ConfigurationSection e ConfigurationElement classes:

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];
        }
    }
}

Em seguida, deixe o quadro de saber como lidar com sua configuração de classes no da web.config:

<configuration>
  <configSections>
    <section name="MyStuffSection" type="MyWeb.Configuration.MyStuffSection" />
  </configSections>
  ...

E, na verdade, adicione a sua própria secção abaixo:

  <MyStuffSection>
    <MyStuff SomeStuff="Hey There!" />
  </MyStuffSection>

Em seguida, você pode usá-lo em seu código assim:

MyWeb.Configuration.MyStuffSection configSection = ConfigurationManager.GetSection("MyStuffSection") as MyWeb.Configuration.MyStuffSection;

if (configSection != null && configSection.MyStuff != null)
{
    Response.Write(configSection.MyStuff.SomeStuff);
}

Há um excelente exemplo no MSDN usando ConfigurationCollection e .NET 4.5 seções personalizadas na web.config que tem uma lista de itens de configuração.

O costume de configuração são bastante úteis coisa e muitas vezes os aplicativos acabar com uma demanda por uma solução extensível.

Para .NET 1.1 consulte o artigo http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Nota:A solução acima trabalha .NET 2.0 bem.

Para .NET 2.0 solução específica, consulte o artigo http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

Você pode fazer isso com Manipuladores de Seção.Há uma visão básica de como escrever um no http://www.codeproject.com/KB/aspnet/ConfigSections.aspx no entanto, refere-se ao aplicativo.config que seria praticamente o mesmo que escrever um para uso na web.config.Isto irá permitir que você tem, essencialmente, a sua própria árvore XML no arquivo de configuração e fazer algumas configurações mais avançadas.

O método mais simples, o que eu achei, está usando seção appSettings.

  1. Adicionar a Web.configuração o seguinte:

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

  2. O acesso a partir de seu código

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top