• 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.