Comment créer sa propre section de configuration dans le web.config ?

Voici un sujet fort intéressant pour beaucoup de développeurs qui organisent quelque peu leur code.

Une section de configuration personnalisé dans un fichier de configuration est la meilleure des choses lorsque cette configuration concerne un besoin métier, une liaison vers un partenaire, un service ou autre. Mais comment diable doit-on faire pour créer sa propre section de configuration avec ces propres propriétés ?

Comme vous le verrez, cela est finalement assez simple et que l’on a perdu l’occasion de le faire avant :-).

La section simple

La section de configuration la plus simple est certainement celle que vous utilisez déjà, illustrée par AppSettings. Voici donc comment entreprendre le même genre de section de configuration.

namespace MyLibrary {
    public class MyCustomSection : ConfigurationSection {
    
        public NameValueConfigurationCollection Settings {
            get {
                return (NameValueConfigurationCollection)base[""];
            }
        }    
    }
}

Cette classe permet ainsi d’utiliser une nouvelle section de configuration, après l’avoir préalablement déclarer.

<configuration>
   <configSections>
      <section name="mySection" type="Library.MyCustomSection, Library" requirePermission="false" />
   </configSections>
   <mySection>    
      <add key="param1" value="value1" />
      <add key="param2" value="value2" />
   </mySection>
</configuration>

Section complexe

Alors sachant que la définition de « complexe » dépend essentiellement de vous et de ce que vous voulez, je vais aborder ici, un peu tout les tableaux. Bien sûr, cela ne va peut-être pas couvrir votre besoin mais il faut bien que chacun bosse un peu quand même ^^.

Voici la classe que j’ai réalisé, je vous la détaille juste après.

using System.Configuration;

namespace MyLibrary
{
    /// 
    /// The configuration section class determines the partners configuration elements
    /// 
    public class PartnerConfigSection : ConfigurationSection
    {
        /// 
        /// The string name of the section in the configuration file as defined in its XML schema
        /// 
        public const string SectionName = "partnerConfig";

        /// 
        /// The XML namespace
        /// 
        /// Used to solve live compilation issue
        [ConfigurationProperty("xmlns", IsRequired = false)]
        public string XmlNamespace
        {
            get { return (string)this["xmlns"]; }
            set { this["xmlns"] = value; }
        }

        /// 
        /// The name of partners group
        /// 
        [ConfigurationProperty("name", IsRequired = false)]
        public string Name
        {
            get { return (string)this["name"]; }
            set { this["name"] = value; }
        }

        /// 
        /// The partner configuration to use it(s) service(s)
        /// 
        [ConfigurationProperty("Partners", IsDefaultCollection = true, IsRequired = false)]
        public PartnerConfigurationCollection Partners
        {
            get { return (PartnerConfigurationCollection)this["Partners"]; }
        }
    }
}

Dans cette classe, vous pouvez observez qu’elle se compose d’une propriété Name et d’une collection d’éléments Partners. Il y a également une subtilité concernant la propriété XmlNamespace qui n’est là que pour permettre la compilation live du web.config lorsque vous l’utiliserez. Si vous voulez le voir plutôt que de me croire (ce qu’il faut toujours faire :-)), supprimez-la et regarder ce que cela provoque ;-).

Voici maintenant la classe PartnerConfigurationCollection de la propriété Partners.

using System.Configuration;

namespace MyLibrary
{
    /// 
    /// The configuration element collection contains all  definitions
    /// 
    public class PartnerConfigurationCollection : ConfigurationElementCollection
    {
        /// 
        /// Gets or sets the  object based on the supplied parameter.
        /// 
        /// 
        /// A  object.
        /// 
        ///The name of the  contained in the collection.
        public new PartnerConfigurationElement this[string name]
        {
            get
            {
                return (PartnerConfigurationElement)this.BaseGet((object)name);
            }
            set
            {
                int index = -1;
                PartnerConfigurationElement configurationElement = (PartnerConfigurationElement)this.BaseGet((object)name);
                if (configurationElement != null)
                {
                    index = this.BaseIndexOf(configurationElement);
                    this.BaseRemoveAt(index);
                }
                this.BaseAdd(index, value);
            }
        }

        /// 
        /// Create a new 
        /// 
        /// Newly created  object
        protected override ConfigurationElement CreateNewElement()
        {
            return new PartnerConfigurationElement();
        }

        /// 
        /// Get the key of the 
        /// 
        ///The  to find the key
        /// 
        protected override object GetElementKey(ConfigurationElement element)
        {
            return ((PartnerConfigurationElement)element).Name;
        }
    }
}

Une collection d’élements PartnerConfigurationElement dont voici la classe

using System.Configuration;

namespace MyLibrary
{
    /// 
    /// The configuration element contains the configuration values of partner
    /// 
    public class PartnerConfigurationElement : ConfigurationElement
    {
        /// 
        /// Get or set the name of partner use as unique key
        /// 
        [ConfigurationProperty("Name", IsRequired = true)]
        public string Name
        {
            get { return (string)this["ClientId"]; }
            set { this["ClientId"] = value; }
        }

        /// 
        /// Get or set the status of availability of the identity provider
        /// 
        [ConfigurationProperty("Enabled", DefaultValue = "false", IsRequired = false)]
        public bool Enabled
        {
            get { return (bool)this["Enabled"]; }
            set { this["Enabled"] = value; }
        }

        /// 
        /// Get or set the identifier of customer for the partner usage
        /// 
        [ConfigurationProperty("ClientId", IsRequired = false)]
        public string ClientId
        {
            get { return (string)this["ClientId"]; }
            set { this["ClientId"] = value; }
        }

        /// 
        /// Get or set the secret key of customer for the partner usage
        /// 
        [ConfigurationProperty("ClientSecret", IsRequired = false)]
        public string ClientSecret
        {
            get { return (string)this["ClientSecret"]; }
            set { this["ClientSecret"] = value; }
        }
        
        /// 
        /// Get or set the parameters collection
        /// 
        [ConfigurationProperty("Parameters", IsDefaultCollection = true, IsRequired = false)]
        public NameValueConfigurationCollection Parameters
        {
            get { return (NameValueConfigurationCollection)this["Parameters"]; }
            set { this["Parameters"] = value; }
        }
    }
}

On a donc une section de configuration qui nous permet de déclarer ceci dans le web.config, ceci :

<configuration>
  <configSections>
    <section name="partnerConfig" type="MyLibrary.PartnerConfigSection, MyLibrary" requirePermission="false" />
  </configSections>
  <partnerConfig xmlns="http://tempuri.org/PartnerConfigSectionSchema.xsd">
    <partner Name="Partner1" Enabled="true">
      <add key="param1" value="2" />
      <add key="url" value="https://api.test.com/" />
    </partner>
    <partner Name="Partner2" ClientId="12345" ClientSecret="mysecret" Enabled="true">
      <add key="url" value="https://api.test2.com/" />
    </partner>  
</configuration>

On a donc vu d’un point de vue « complexe » comment mixer propriété et collection d’éléments dans une section de configuration, comment définir une collection d’éléments et comment définir un élément.

Maintenant que vous savez comment faire, au boulot :-).

Publicités
Comment créer sa propre section de configuration dans le web.config ?

Une réflexion sur “Comment créer sa propre section de configuration dans le web.config ?

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s