Come faccio a definire web personalizzato.config sezioni con un potenziale bambino di elementi e attributi per la proprietà?

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

  •  08-06-2019
  •  | 
  •  

Domanda

Le applicazioni web sviluppo spesso richiedono un co-dipendente impostazioni di configurazione e ci sono anche le impostazioni che devono cambiare come ci si sposta tra ciascuno dei nostri ambienti.

Tutte le nostre impostazioni sono attualmente semplice coppie chiave-valore, ma sarebbe utile creare config sezioni, in modo che è ovvio che quando i due valori devono cambiare insieme o quando le impostazioni bisogno di cambiare per un ambiente.

Qual è il modo migliore per creare personalizzato di configurazione, sezioni e ci sono particolari considerazioni da fare quando si recuperano i valori?

È stato utile?

Soluzione

L'utilizzo di attributi, bambino config sezioni e vincoli

C'è anche la possibilità di utilizzare gli attributi che si occupa automaticamente di impianti idraulici, oltre a fornire la possibilità di aggiungere facilmente i vincoli.

Ho qui presente un esempio di codice uso io in uno dei miei siti.Con un vincolo, ho dettare la quantità massima di spazio su disco qualsiasi utente può utilizzare.

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

Questo è impostato in web.config come

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

Gli elementi figlio

Il bambino elemento xml mail viene creato nella stessa .cs file come quello di cui sopra.Qui ho aggiunto i vincoli sulla porta.Se la porta viene assegnato un valore non in questo intervallo il runtime si lamentano quando la config è caricato.

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

Utilizzare

Per utilizzarlo praticamente in codice, tutto quello che dovete fare è creare un'istanza della MailCenterConfigurationObject, questo si automaticamente leggere le sezioni del web.config.

MailCenterConfiguration.cs

private static MailCenterConfiguration instance = null;
public static MailCenterConfiguration Instance
{
    get
    {
        if (instance == null)
        {
            instance = (MailCenterConfiguration)WebConfigurationManager.GetSection("mailCenter");
        }

        return instance;
    }
}

Unaltrofile.cs

public void SendMail()
{
    MailCenterConfiguration conf = MailCenterConfiguration.Instance;
    SmtpClient smtpClient = new SmtpClient(conf.Mail.Host, conf.Mail.Port);
}

Controllare la validità di

Ho già detto che il runtime si lamentano quando la configurazione viene caricata e alcuni dati non conformi alle regole impostate (ad es.in MailCenterConfiguration.cs).Io tendo a voler sapere queste cose il più presto possibile, quando il mio sito genera.Un modo per risolvere questo problema è caricare la configurazione in _Global.asax.cx.Application_Start_ , se la configurazione non valida si sarà informato con i mezzi di un'eccezione.Il tuo sito non si avvia e invece lei sarà presentato dettagliate informazioni sull'eccezione in Schermo giallo della morte.

Globale.asax.cs

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

Altri suggerimenti

Quick and Dirty:

Prima di creare il vostro ConfigurationSection e ConfigurationElement classi:

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

Poi lasciare che il quadro di sapere come gestire il tuo classi di configurazione in web.config:

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

E aggiungere la propria sezione di seguito:

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

Quindi è possibile utilizzare nel tuo codice così:

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

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

C'è un ottimo esempio su MSDN utilizzando ConfigurationCollection e .NET 4.5 per le sezioni personalizzate nel web.config che dispone di un elenco di termini config.

La configurazione personalizzata sono molto pratico cosa e spesso le applicazioni finire con una domanda per un allungabile soluzione.

Per .NET 1.1, si prega di consultare l'articolo http://aspnet.4guysfromrolla.com/articles/020707-1.aspx

Nota:La soluzione di cui sopra funziona per .NET 2.0.

Per .NET 2.0 soluzione specifica, si prega di consultare l'articolo http://aspnet.4guysfromrolla.com/articles/032807-1.aspx

È possibile eseguire questa operazione con i Gestori delle sezioni.C'è una panoramica di base di come scrivere uno alla http://www.codeproject.com/KB/aspnet/ConfigSections.aspx tuttavia si riferisce a app.config, che sarebbe più o meno come scrivere uno per l'uso nel web.config.Questo vi permetterà di avere in sostanza il proprio albero XML nel file di configurazione e fare qualche configurazione più avanzata.

Il metodo più semplice che ho trovato, è l'uso di sezione appSettings.

  1. Aggiungi a Web.config il seguente:

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

  2. L'accesso dal tuo codice

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top