Les sections de configuration en .NET 1.x => 2.0 (et actuel)

Les sections de configuration ont beaucoup évolué.... La semaine passé, j'ai pris part à une petite discussion sur cette partie de .Net et j'ai profité de ce we (pour traîner sur le côte d'opale mais ca ce n'est pas intéressant ;-)) pour récupérer dans mon SVN des anciens fichiers de configuration de section. Ce petit post explique donc le passage de .net 1.x => 2.0. En effet, la méthode utilisée pour récupérer les données des sections a changé.
  • Section de configuration:
  • <NHibernateManager SQLGeneratorType="SQLITE">
     <Databases>
         <Database id="DefaultDatabase" crypted="false" fileName="DefaultDataBase.cfg"/>
      </Databases>
    </NHibernateManager>
    
  • Sous .NET 1.x
  • On crée une classe qui hérite de l'interface IConfigurationSectionHandler. Cette classe ne contient qu'une seule méthode qui renvoie un objet. Cet objet est celui renvoyé lorsque l'on demande le GetSection. Il faut donc parser tout le noeud XML de la section et créer le modèle en conséquence.
    Voici un exemple:
    1. Classe concrète
    2. public class NHibernateConfigurationManager : IConfigurationSectionHandler
      {
         public object Create(object parent, object configContext, XmlNode section) 
         { ... }
      }
      
    3. App.Config
    4. <section name="NHibernateManager" 
         type="NhibernateDbManager.NHibernateConfigurationManager,
         NhibernateDbManager"/>
      
  • Sous .net 2.0 et +
  • A partir de la version 2.0 de .net, il ne faut plus implémenter une classe pour lire le noeud XML. Il suffit de reprendre les classes utilisées sous .Net 1.x et de "tag" les propriétés avec les bons attributs et d'hériter des bonnes classes. Une autre technique alternative aux attributs est l'utilsation d'objets ConfigurationProperty pour déclarer les propriétés. En cas d'existant, il est préférable d'utiliser les attributs.
    L'exemple fourni ci-dessous provient des bibliothèques Lelibre.* et utilisent les attributs/héritages.
    1. App.Config
    2. <section name="NHibernateManager" 
         type="NhibernateDbManager.NHibernateOptions,
         NhibernateDbManager"/>
      
    3. Classes
    4. public class NHibernateOptions : ConfigurationSection
      {
          [ConfigurationProperty("SQLGeneratorType", IsRequired = true)]
          public string SQLGeneratorType
          {
              get
              {
                  return (string)this["SQLGeneratorType"];
              }
              set
              {
                  this["SQLGeneratorType"] = value;
              }
          }
      
          [ConfigurationProperty("Databases")]
          [ConfigurationCollection(typeof(ModuleConfigurationDatabases), AddItemName = "Database")]
          public ModuleConfigurationDatabases Databases
          {
              get
              {
                  return (ModuleConfigurationDatabases)this["Databases"];
              }
          }
      }
      
      
      public class ModuleConfigurationDatabases : ConfigurationElementCollection
      {
          public ModuleConfiguration this[int index]
          {
              get { return (ModuleConfiguration)base.BaseGet(index); }
          }
      
          #region Implémentation de ConfigurationElementCollection
      
          protected override ConfigurationElement CreateNewElement()
          {
              return new ModuleConfiguration();
          }
      
          protected override object GetElementKey(ConfigurationElement element)
          {
              return ((ModuleConfiguration)element).ID;
          }
      
          #endregion
      }
      
      public class ModuleConfiguration : ConfigurationElement
      {
          [ConfigurationProperty("id", DefaultValue = "DefaultDatabase", IsRequired = true, IsKey = true)]
          public string ID
          {
              get
              {
                  return (string)this["id"];
              }
              set
              {
                  this["id"] = value;
              }
          }
      
          [ConfigurationProperty("fileName", IsRequired = true)]
          public string FilePath
          {
              get
              {
                  return (string)this["fileName"];
              }
              set
              {
                  this["fileName"] = value;
              }
          }
      
          [ConfigurationProperty("crypted", DefaultValue = false)]
          public bool Crypted
          {
              get
              {
                  return (bool)this["crypted"];
              }
              set
              {
                  this["crypted"] = value;
              }
          }
      }
      
J'espère que ce petit post vous aura éclairé sur les sections de configuration.

Ajouter un commentaire

Le code HTML est affiché comme du texte et les adresses web sont automatiquement transformées.

Fil des commentaires de ce billet

Page top