Publié
lundi 26 mai 2008 14:59
par
Luke77
Je reviens après de longs jours d'absence, pour cause de fin de projet et accessoirement de vacances, que je reviens pour écrire ce post.
Comme je l'ai indiqué, les posts que j'écris sont en rapport direct avec un projet que j'essaye de mener depuis de nombreux mois. Ils n'entendent pas révolutionner la façon dont les choses sont faîtes, ni utiliser les dernières technologies à la mode sauf si ces dernières peuvent apporter un réel bénéfice au projet.
Ainsi après avoir établi le Cache, élément indispensable (selon moi), il vient une autre partie que je trouve tout aussi indispensable, une gestion de la configuration. Le Framework propose pour cela une gestion de la configuration à l'aide des sections dans les fichiers .config . Cette configuration fonctionne très bien et est qui plus est très pratique.
Cependant lorsque l'on travaille dans une ferme, modifier ces fichiers de configuration impose de redéployer sur l'ensemble de la ferme (ce qui implique potentiellement d'autres services tel que celui chargé de la production par exemple), et fait aussi redémarrer le site web sur chaque frontal. De même, lorsque une configuration est partagée entre plusieurs applications, impacter toutes les applications lorsqu'une modification a lieu n'est pas forcement une chose aisée non plus.
Pour palier ces désagréments, j'ai eu l'occasion de mettre en place chez mon client adoré un petit système simple de configuration géré en base de données dont je me propose d'expliquer ici son fonctionnement.
Comme indiqué quelques lignes plus haut, cette configuration doit pouvoir être commune à plusieurs applications. Cependant chaque application doit avoir la possibilité de surcharger cette valeur par ses valeurs propres. Enfin Il faut que l'information en base de données soit un minimum structurée et que les valeurs chargées depuis la base de données soient montées en cache.
Tout d'abord, définissons le moyen d'identifier l'application en cours, et le moyen d'accéder à la base de donnée. Il faut bien un minimum de configuration dans des fichiers, cela se définira donc au niveau du .config grâce à une section créée pour l'occasion. Voici le code bien compliqué de la section :
1: internal class StartupConfigurationSection : ConfigurationSection
2: {
3: [ConfigurationProperty("ApplicationName", IsRequired=true)]
4: public string ApplicationName
5: {
6: get { return (string)this["ApplicationName"]; }
7: }
8:
9: [ConfigurationProperty("ConnectionStringName", IsRequired = false, DefaultValue = "Default")]
10: public string ConnectionStringName
11: {
12: get { return (string)this["ConnectionStringName"]; }
13: }
14: }
que l'on configure comme ceci dans le .config par exemple :
1: <configSections>
2: <section name="startupConfiguration" type="JALUM.Utility.Configuration.StartupConfigurationSection, JALUM.Utility.Configuration"/>
3: </configSections>
4:
5: <startupConfiguration ApplicationName="ConfigurationManager"/>
6:
7: <connectionStrings>
8: <add name="Default" connectionString="Data Source=localhost;Initial Catalog=Configuration;Integrated Security=SSPI"/>
9: </connectionStrings>
Ensuite en base, il est nécessaire d'avoir une petite table qui va contenir les données sous la forme clé / valeur (les tailles des champs sont donnés à titre indicatif) :
et la procédure stockée qui va bien avec pour récupérer les valeurs :
1: CREATE PROCEDURE [Conf].[P_GetConfigurationAttribute]
2: -- Add the parameters for the stored procedure here
3: @ApplicationName nvarchar(64) = null,
4: @Key nvarchar(128)
5: AS
6: BEGIN
7:
8: IF (@ApplicationName IS NULL)
9: BEGIN
10: SELECT [Value]
11: FROM [T_ConfigurationAttributes] (NOLOCK)
12: WHERE [ApplicationName] IS NULL AND [Key] = @Key
13: END
14: ELSE
15: BEGIN
16: SELECT [Value]
17: FROM [T_ConfigurationAttributes] (NOLOCK)
18: WHERE [ApplicationName] = @ApplicationName AND [Key] = @Key
19: END
20: END
Et voilà pour la première partie de la future couche de configuration. Ok rien de bien fabuleux non plus mais petit à petit l'oiseau fait son nid...
Ce post vous a plu ? Ajoutez le dans vos favoris pour ne pas perdre de temps à le retrouver le jour où vous en aurez besoin :