1 Introduction
Dans la série des petits articles bien ciblés que je me suis fixé d’écrire, je vous propose dans cet épisode d’étendre les sections définies dans le fichier Web.config. En effet, la fameuse balise « appSettings » peut vite devenir difficile à gérer à partir du moment où l’on commence à avoir de nombreuses clés. Il devient alors intéressant de spécialiser ce paramétrage applicatif par nos propres balises.
Cet exemple a été conçu sur le Framework 1.1 et en Visual Basic .NET.
2 Un peu de théorie
2.1 « appSettings »
Comme vous le savez, vous avez la possibilité de stocker vos paramètres applicatifs dans le fichier de configuration (Web.config) de l’application Web. La section utilisée est la suivante :
<appSettings>
<add key="app1" value="appSettings - Valeur app1" />
<add key="app2" value="appSettings - Valeur app2" />
<add key="app3" value="appSettings - Valeur app3" />
</appSettings>
Il s’agit d’une collection de paires clé/valeur. L’accès est réalisé à l’aide de la classe :
ConfigurationSettings.AppSettings("NomDeLaCle")
Cette classe hérite de « System.Collections.Specialized.NameValueCollection ». Elle permet d’implémenter les concepts de base pour les collections triées de paires clés (de type chaîne) / valeurs (de type chaîne). Les valeurs stockées sont accessibles soit par la clé, soit par l’index de l’élément.
2.2 Votre « appSettings » de type clé/valeur
.NET vous offre la possibilité d’étendre les sections existantes, notamment au travers de classes implémentant les comportements des collections de type clé/valeur. Pour cela, trois étapes :
1. Associer dans le fichier de configuration le nom de votre nouvelle balise avec la classe qui permettra d’en gérer l’accès :
Le framework propose aussi les classes prédéfinies suivantes :
· DictionarySectionHandler
· IgnoreSectionHandler
· NameValueSectionHandler
· SingleTagSectionHandler
Pour plus d’informations sur ces classes, je vous invite à consulter la librairie MSDN qui sera plus exhaustive que moi !
2. Créer la section correspondante dans le fichier de configuration et la remplir. Par exemple, pour mon cas :
<monAppSettingsAMoi>
<add key="MaCle1" value="monAppSettingsAMoi - Ma valeur 1" />
<add key="MaCle2" value="monAppSettingsAMoi - Ma valeur 2" />
<add key="MaCle3" value="monAppSettingsAMoi - Ma valeur 3" />
</monAppSettingsAMoi>
3. Utiliser cette nouvelle section de la manière suivante pour accéder à la valeur de la clé « Macle1 » :
CType(System.Configuration.ConfigurationSettings.GetConfig("monAppSettingsAMoi"), IDictionary)("MaCle1")
2.3 Votre propre section spécifique
Jusque là, je vous ai montré comment réutiliser les classes existantes du Framework pour concevoir votre propre section. Il me reste maintenant à vous expliquer comment être plus proche de vos besoins en créant votre propre classe implémentant votre propre traitement. Pour cela, il vous suffit de créer une classe dédiée implémentant l’interface « IConfigurationSectionHandler ».
Cette dernière impose l’implémentation de la méthode « Create(...) » permettant d’accéder aux informations de votre section par la récupération d’un « XmlNode ». Il vous suffit ensuite de construire un objet spécifique dédié au informations de la section (par exemple une collection spécialisée de vos propres éléments).
Voici donc les différentes étapes pour créer votre propre section :
1. Associer dans le fichier de configuration le nom de votre nouvelle balise avec la classe qui permettra d’en gérer l’accès :
<configSections>
<section
name="maSectionAMoi"
type="Bewise.configSections.MaSectionAMoiConfigHandler,
Bewise.ConfigSections" />
</configSections>
2. Créer la section correspondante dans le fichier de configuration et la remplir. Voici un exemple :
<maSectionAMoi>
<items>
<item
id="Bewise"
value="Site Web société Bewise"
url="http://www.bewise.fr" />
<item
id="BlogBewise"
value="Blog société Bewise"
url="http://blog.bewise.fr" />
<item
id="Vertice"
value="Site Web société Vertice"
url="http://www.vertice.fr" />
</items>
</maSectionAMoi>
3. Créer une classe implémentant l’interface « IConfigurationSectionHandler ». Par exemple :
Public Class MaSectionAMoiConfigHandler
Implements IConfigurationSectionHandler
Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object Implements System.Configuration.IConfigurationSectionHandler.Create
...
Public Function
End Class
4. Utiliser cette nouvelle section de la manière suivante pour accéder à la valeur de la clé « Bewise »
CType(System.Configuration.ConfigurationSettings.GetConfig("maSectionAMoi"), ItemCollection)("Bewise")
Pour plus de détail sur la création de la classe de traitement, je vous invite à regarder les sources fournies avec l’article.
L’exemple proposé est un site Web composé des éléments suivants :
· « Web.config » : contenant les informations de configuration et de paramétrage de l’application.
C’est dans ce fichier que vous retrouvez les points « 1. » et « 2. » du paragraphe précédent.
· « MaSectionAMoiConfigHandler » : création de la classe chargée du traitement lors de l’accès à la nouvelle balise créée.
La méthode « Create » est chargée de la lecture du fichier de configuration
C’est dans ce fichier que vous retrouvez le point « 3. » du paragraphe précédent.
· « ConfigurationSettings.vb » : cette classe permet d’encapsuler l’accès à vos informations de configuration applicative (appSettings et autres). En effet, il m’est apparu important de proposer cette encapsulation afin de regrouper dans une classe unique les différentes sections de paramétrage de l’application Web. A noter que l’ensemble des membres de cette classe sont déclarés comme « Shared » en VB ou « Static » en C#.

Bien sûr, l’idéal aurait été de créer une classe héritant de « System.Configuration.ConfigurationSettings ». Cela s’est avéré impossible dans la mesure où la définition de cette classe ne le permet pas (« NotInheritable » en VB ou « sealed » en C#).
C’est dans ce fichier que vous retrouvez le point « 4. » du paragraphe précédent.
· « default.aspx » : cette page web est chargée de l’affichage des 3 sections définies dans l’exemple :
o Les appSettings traditionnels dans une ListBox
o Un appSettings spécifique dans une ListBox
o Une section spécifique dans une datagrid

· « ItemCollection.vb » : ce fichier regroupe en fait deux classes : « Item » et « ItemCollection ». L’idée étant de créer une collection spécifique des éléments listés dans la nouvelle section du fichier de configuration.
Pour plus de détail, je vous invite à consulter les sources de cette application.
4 Conclusion
Au travers de cet exemple, je vous ai montré qu’il était relativement simple d’étendre le fichier de configuration avec vos propres balises. En utilisant cette façon de faire, vous améliorerez grandement la lisibilité et la maintenance de votre fichier de configuration à partir du moment où vous commencerez à avoir de nombreux paramétrages applicatifs. Voici quelques exemples de sections spécifiques :
· Liste des SGBD utilisés au sein de l’application,
· Liste des ordres SQL utilisés au sein de votre application. Cette option est utile si votre SGBD ne sait pas gérer la notion de procédures stockées, ou bien si pour des raisons diverses et variées, il vous est impossible d’en créer (pas de droits administratifs sur le système en production, etc.),
· Etc.