Vă mulțumim pentru susținere

Cum pot defini secțiuni personalizate web.config cu elemente și atribute de copil potențiale pentru proprietăți?

Aplicațiile web pe care le dezvoltă necesită adesea setări de configurare co-dependente și există, de asemenea, setări care trebuie să se schimbe pe măsură ce ne mutăm între fiecare dintre mediile noastre.

Toate setările noastre sunt în prezent perechi simple de chei de valoare, dar ar fi util să creați secțiuni configurări personalizate astfel încât să fie evident când două valori trebuie schimbate împreună sau când setările trebuie să se schimbe pentru un mediu.

Care este cel mai bun mod de a crea secțiuni de configurări personalizate și care sunt considerentele speciale pe care le puteți face la extragerea valorilor?

0
adăugat editat

5 răspunsuri

Utilizarea atributelor, secțiunilor și constrângerilor configurării copiilor

Există, de asemenea, posibilitatea de a folosi atribute care au în mod automat grijă de instalații sanitare, precum și posibilitatea de a adăuga cu ușurință constrângeri.

Aici prezint un exemplu de cod care mă folosesc pe unul din site-urile mele. Cu o constrângere eu dictez volumul maxim de spațiu pe disc pe care un utilizator este permis să îl folosească.

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

Acest lucru este configurat în web.config ca atare


    
    
...

    

Elemente pentru copii

Elementul copil xml mail este creat în același fișier .cs ca cel de mai sus. Aici am adăugat constrângeri în port. Dacă portului i se atribuie o valoare care nu se încadrează în acest interval, timpul de execuție se va plânge când se va încărca config-ul.

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ți

Pentru a-l utiliza apoi practic în cod, tot ce trebuie să faceți este să instanțiați MailCenterConfigurationObject, acesta va automat citi secțiunile relevante din 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ți validitatea

Am menționat anterior că timpul de rulare se va plânge atunci când configurația este încărcată, iar unele date nu respectă regulile pe care le-ați configurat (de exemplu, în MailCenterConfiguration.cs). Tind să vreau să cunosc aceste lucruri cât mai curând posibil, când site-ul meu se declanșează. O modalitate de a rezolva aceasta este încărcarea configurației în _Global.asax.cx.Application_Start_, în cazul în care configurația este nevalidă, veți fi informat despre aceasta cu mijloacele unei excepții. Site-ul dvs. nu va porni, iar în loc să vi se prezinte informații detaliate despre excepție în Ecranul galben al morții .

Global.asax.cs

protected void Application_ Start(object sender, EventArgs e)
{
    MailCenterConfiguration.Instance;
}
0
adăugat
Cum ați schimba codul dacă așteptați mai multe elemente copil?
adăugat autor Kevin Le - Khnle

Quick'n Dirty:

Mai întâi creați clasele ConfigurationSection și 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), "");

        this.Properties.Add(_SomeStuff);
    }

    public string SomeStuff
    {
        get
        {
            return (String)this[_SomeStuff];
        }
    }
}

Apoi, permiteți cadrului să știe cum să se ocupe de clasele de configurare din web.config :


  
    
  
  ...

Și, de fapt, adăugați secțiunea proprie:

  
    
  

Apoi îl puteți folosi în codul dvs. astfel:

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

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

Puteți realiza acest lucru cu ajutorul secțiunilor. Există o prezentare de ansamblu a modului de scriere a uneia la adresa http://www.codeproject.com /KB/aspnet/ConfigSections.aspx Cu toate acestea, se referă la app.config, care ar fi cam la fel ca și scrierea pentru utilizarea în web.config. Acest lucru vă va permite să aveți în esență propriul arbore XML în fișierul config și să efectuați o configurație mai avansată.

0
adăugat

Există un excelent exemplu pe MSDN folosind ConfigurationCollection și .NET 4.5 pentru secțiunile personalizate din web.config care are o listă de elemente config.

0
adăugat

The most simple method, which I found, is using appSettings section.

  1. Add to Web.config the following:

    
        
    
    
  2. Access from your code

    NameValueCollection appSettings = ConfigurationManager.AppSettings;
    string myPropVal = appSettings["MyProp"];
    
0
adăugat