Créez vos propres sections personnalisées dans un fichier Web.config en Visual Basic .NET
Par Frédéric Colin, posté le 09/08/2004
Profil : Développeur | Niveau : Intermédiaire (200)
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 :
1: <appSettings>2: <add key="app1" value="appSettings - Valeur app1" />3: <add key="app2" value="appSettings - Valeur app2" />4: <add key="app3" value="appSettings - Valeur app3" />5: appSettings>
Il s'agit d'une collection de paires clé/valeur. L'accès est réalisé à l'aide de la classe :
1: 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 :
1: <monAppSettingsAMoi>2: <add key="MaCle1" value="monAppSettingsAMoi - Ma valeur 1" />3: <add key="MaCle2" value="monAppSettingsAMoi - Ma valeur 2" />4: <add key="MaCle3" value="monAppSettingsAMoi - Ma valeur 3" />5: monAppSettingsAMoi>
3. Utiliser cette nouvelle section de la manière suivante pour accéder à la valeur de la clé « Macle1 » :
1: 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 :
1: <configSections>2: <section3: name="maSectionAMoi"4: type="Bewise.configSections.MaSectionAMoiConfigHandler, />5: Bewise.ConfigSections"6: configSections>
2. Créer la section correspondante dans le fichier de configuration et la remplir. Voici un exemple :
1: <maSectionAMoi>2: <items>3: <item4: id="Bewise"5: value="Site Web société Bewise"6: url="http://www.bewise.fr" />7: <item8: id="BlogBewise"9: value="Blog société Bewise"10: url="http://blog.bewise.fr" />11: <item12: id="Vertice"13: value="Site Web société Vertice"14: url="http://www.vertice.fr" />15: items>16: maSectionAMoi>
3. Créer une classe implémentant l'interface « IConfigurationSectionHandler ». Par exemple :
1: Public Class MaSectionAMoiConfigHandler2: Implements IConfigurationSectionHandler3:4: Public Function Create(ByVal parent As Object, ByVal configContext As Object, ByVal section As System.Xml.XmlNode) As Object Implements System.Configuration.IConfigurationSectionHandler.Create5:6: ...7:8: Public Function9: 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.
3 L'exemple par le code
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étails, 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.
Après avoir dirigé la Gestion de la Production à Bewise pendant de nombreuses années, Frédéric a rejoint Vertice, une société du groupe éditrice de la gamme Nova et spécialisée dans la 3D interactive. Partisan d’une 3D interactive mais aussi démonstrative et utile, il s’attache à illustrer ses propos via son blog. Malgré ce changement de poste, il n’en a pas oublié ses racines de développeur et continue de participer à la communauté .NET en publiant des articles sur la conception d’Architectures pragmatiques et distribuées. Retombé depuis peu dans les musiques de type « Métal » pour le plus grand malheur de ses collègues de bureau, il n’en reste pas moins éclectique dans ses goûts musicaux !



