Désactiver Adblock

AdBlock bloque du contenu sur le site

ADBlock errore

Comment définir des sections web.config personnalisées avec des éléments enfants et des attributs pour les propriétés?

StackOverflow https://stackoverflow.com/questions/2155
  •   asp.net
  •  | 
  •  
  •  | 
  •   ( words)
 Vérifié

Question

Les applications Web que je développe nécessitent souvent des paramètres de configuration dépendants et certains paramètres doivent également être modifiés à mesure que nous passons d'un environnement à l'autre.

Tous nos paramètres sont actuellement des paires de valeurs clé simples, mais il serait utile de créer des sections de configuration personnalisées de manière à ce qu'il soit évident que deux valeurs doivent être modifiées simultanément ou que les paramètres doivent être modifiés pour un environnement.

Quel est le meilleur moyen de créer des sections de configuration personnalisées et y at-il des considérations spéciales à prendre en compte lors de la récupération des valeurs?

Solution

Utilisation d'attributs, de sections de configuration enfant et de contraintes

Il est également possible d’utiliser des attributs qui s’occupent automatiquement de la plomberie et d’ajouter facilement des contraintes.

Je présente ici un exemple de code que je m'utilise moi-même dans l'un de mes sites. Avec une contrainte, je dicte la quantité maximale d'espace disque qu'un utilisateur est autorisé à utiliser.

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

Ceci est configuré dans web.config comme si

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

Éléments enfants

L'élément xml enfant mail est créé dans le même fichier .cs que celui ci-dessus. Ici, j'ai ajouté des contraintes sur le port. Si une valeur ne se trouvant pas dans cette plage est attribuée au port, le moteur d'exécution se plaindra lors du chargement de la configuration.

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

Utiliser

Pour l'utiliser ensuite pratiquement dans le code, il vous suffit d'instancier l'objet MailCenterConfigurationObject. Ceci lira automatiquement les sections pertinentes de 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);
}

Vérifier la validité

J'ai déjà mentionné que le moteur d'exécution se plaindrait lorsque la configuration serait chargée et que certaines données ne seraient pas conformes aux règles que vous avez définies (par exemple, dans MailCenterConfiguration.cs). J'ai tendance à vouloir savoir ces choses dès que possible lorsque mon site démarre. Une façon de résoudre ce problème consiste à charger la configuration dans _Global.asax.cx.Application_Start_. Si la configuration est invalide, vous en serez averti par le biais d'une exception. Votre site ne démarre pas et vous obtiendrez à la place des informations détaillées sur les exceptions dans le Écran jaune de la mort .

Global.asax.cs

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

Autres conseils

Quick'n Dirty:

Créez d'abord vos classes ConfigurationSection et 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];
        }
    }
}

Indiquez ensuite au gestionnaire comment gérer vos classes de configuration dans web.config :

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

Et ajoutez en fait votre propre section ci-dessous:

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

Ensuite, vous pouvez l'utiliser dans votre code ainsi:

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

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

Il existe un excellent exemple sur MSDN avec < code> ConfigurationCollection et .NET 4.5 pour les sections personnalisées de web.config contenant une liste d'éléments de configuration.

La configuration personnalisée est très pratique et les applications finissent souvent par exiger une solution extensible.

Pour .NET 1.1, veuillez vous reporter à l'article http://aspnet.4guysfromrolla.com. /articles/020707-1.aspx

Remarque: la solution ci-dessus fonctionne également pour .NET 2.0.

Pour la solution spécifique à .NET 2.0, veuillez vous reporter à l'article http: // aspnet. 4guysfromrolla.com/articles/032807-1.aspx

Vous pouvez y parvenir avec les gestionnaires de sections. Vous trouverez un aperçu de base de la rédaction de celui-ci à l'adresse http://www.codeproject.com. /KB/aspnet/ConfigSections.aspx Cependant, il fait référence à app.config, ce qui revient à peu près à en écrire un à utiliser dans web.config. Cela vous permettra d’avoir essentiellement votre propre arborescence XML dans le fichier de configuration et d’effectuer une configuration plus avancée.

La méthode la plus simple, que j'ai trouvée, utilise section appSettings .

  1. Ajoutez à Web.config ce qui suit:

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

  2. Accéder à partir de votre code

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow