Depuis sa publication, les applications et les composants ASP.NET ont utilisé le fichier web.config pour charger les paramètres nécessaires à leur fonctionnement. Cependant, l'ajout de paramètres personnalisés pour ajouter de la flexibilité et de la robustesse à une application ou à un composant n'est pas aussi simple que la plupart des gens le souhaiteraient. Cet article vous apprend à écrire les classes nécessaires à la gestion des éléments de configuration XML et à utiliser les paramètres qu'elles contiennent dans votre code..
Tutoriel republiéToutes les quelques semaines, nous revoyons certains des articles préférés de nos lecteurs tout au long de l'histoire du site. Ce tutoriel a été publié pour la première fois en novembre 2012..
Le .NET Framework fournit une grande variété de paramètres pouvant être configurés dans web.config pour modifier le comportement d'un ou de plusieurs composants intégrés dans l'application. Pour certains développeurs, s'en tenir uniquement aux paramètres fournis par .NET Framework est suffisant. Mais beaucoup plus de développeurs ont besoin de contrôler un ensemble plus vaste de paramètres - soit pour des composants (écrits par eux-mêmes ou par un tiers), soit simplement pour un ensemble de valeurs qu'ils utilisent tout au long de leur application..
Le fichier web.config vous permet de définir des paramètres personnalisés avec le
Les paramètres clé / valeur peuvent certainement être utiles dans de nombreuses circonstances, mais
Heureusement, Microsoft permet aux développeurs d’écrire des classes qui ajoutent un accès par programme aux paramètres de configuration personnalisés contenus dans web.config..
Les paramètres de web.config sont classés en sections de configuration. Par exemple, les paramètres contenus dans le
section concerne les paramètres ASP.NET pour votre application. Vous pouvez modifier le schéma d'authentification de votre application, ajouter ou supprimer des gestionnaires HTTP pour exécuter des fonctions spécifiques pour des types de fichiers spécifiques. le
Une section de configuration est requise pour tous les paramètres non contenus dans
La configuration utilisée à titre d'exemple dans ce tutoriel concerne un composant qui récupère des flux RSS ou Atom. Il ne fait aucune analyse, car cela sort du cadre de ce tutoriel. Au lieu de coder en dur la liste des flux à récupérer, le composant se fie à sa configuration pour contenir les noms et les URL des flux à récupérer. Le composant s'appelle FeedRetriever, et la structure XML souhaitée pour sa configuration ressemble à ceci:
le
Celles-ci
La configuration ci-dessus est simple. le
Après avoir conçu la structure XML, l'étape suivante consiste à écrire un gestionnaire de configuration pour traiter les paramètres définis dans le XML. Le gestionnaire est principalement une classe qui hérite de System.Configuration.ConfigurationSection, mais il intègre également l'utilisation d'autres classes, telles que les classes dérivées de System.Configuration.ConfigurationElement et System.Configuration.ConfigurationElementCollection..
Les classes basées sur ConfigurationElement représentent des éléments individuels. c'est le bloc de construction d'une section de configuration. Les types dérivés de ConfigurationElementCollection représentent simplement des éléments contenant plus d'un type d'élément. Dans la configuration indiquée ci-dessus, le
ÉlémentVous allez commencer avec le
Chaque objet ConfigurationElement fonctionne comme un indexeur pour sa collection interne de valeurs de propriété. C’est cette collection interne, avec les attributs .NET, qui vous permet de mapper le
Le code suivant est le code complet de la classe FeedElement:
Classe publique FeedElement: ConfigurationElement [ConfigurationProperty ("name", IsKey = true, IsRequired = true)] chaîne publique Name get return (chaîne) this ["name"]; set this ["name"] = value; [ConfigurationProperty ("url", IsRequired = true, DefaultValue = "http: // localhost")] [RegexStringValidator (@ "https? \: // \ S +")] chaîne publique Url get return (chaîne) this ["url"]; set this ["url"] = valeur; [ConfigurationProperty ("cache", IsRequired = false, DefaultValue = true)] public bool Cache get return (bool) this ["cache"]; set this ["cache"] = value;
La classe ConfigurationElement sert d'indexeur à une collection sous-jacente de propriétés de configuration (d'où la notation d'indexeur de this [keyValue]). En utilisant le mot-clé this et en accédant à la propriété sous-jacente à l'aide d'une clé de chaîne, vous pouvez obtenir et définir la valeur de la propriété sans avoir besoin d'un champ privé pour contenir ces données. La collection de propriétés sous-jacente stocke les données sous le type Object; par conséquent, vous devez convertir la valeur en tant que type approprié si vous souhaitez faire quoi que ce soit avec elle.
Les propriétés représentant les attributs XML sont décorées avec les attributs ConfigurationPropertyAttribute. Le premier paramètre de l'attribut ConfigurationPropertyAttribute est le nom de l'attribut XML trouvé dans la liste.
La valeur par défaut de "http: // localhost" pour la propriété Url n'est pas une erreur. Le .NET Framework vous permet également de décorer les propriétés avec des attributs de validation, tels que RegexStringValidatorAttribute, qui décore la propriété Url. Ce validateur prend la valeur de la propriété Url et la valide par rapport à l'expression régulière fournie à l'attribut; Cependant, il valide également la propriété Url avant qu'il ne contienne les données de l'élément XML. La valeur par défaut de la propriété Url est une chaîne vide lors de la création initiale d'un objet FeedElement. Une chaîne vide ne valide pas l'expression régulière fournie. Par conséquent, le validateur lève une exception ArgumentException avant que des données ne soient chargées à partir du fichier XML..
Deux solutions de contournement sont possibles pour ce problème. La première approche modifie l'expression régulière pour autoriser les chaînes vides. La deuxième approche attribue une valeur par défaut à la propriété. Ce n'est pas grave dans ce cas particulier. Même avec une valeur par défaut, l’attribut url est toujours un attribut requis dans
Il existe plusieurs autres attributs de validation dans l'espace de noms System.Configuration pour valider les données affectées aux propriétés et les attributs XML auxquels elles sont mappées. La liste suivante répertorie tous les attributs du validateur dans l'espace de noms System.Configuration:
À l'exception de CallbackValidatorAttribute, il n'est pas nécessaire de créer les objets de validation correspondants à utiliser avec les attributs de validation. Le runtime .NET crée les objets de validation appropriés pour vous et les attributs contiennent les paramètres nécessaires à la configuration des objets de validation..
Ce petit morceau de code est tout ce qui est nécessaire pour représenter par programme des
La représentation XML de la
La classe ConfigurationElementCollection contient plusieurs membres, mais deux seulement sont marqués comme abstraits. Ainsi, la plus simple implémentation de ConfigurationElementCollection a deux méthodes:
Dans cet esprit, consultez le code complet de la classe FeedElementCollection ci-dessous:
[ConfigurationCollection (typeof (FeedElement))] classe publique FeedElementCollection: ConfigurationElementCollection protégé substitue ConfigurationElement CreateNewElement () retour new newElementElement (); objet de substitution protégé GetElementKey (élément ConfigurationElement) return (élément (FeedElement)). .Name;
Un ConfigurationCollectionAttribute décore cette classe de collection. Le premier paramètre de l'attribut est un objet Type - le type des éléments contenus dans la collection. Dans ce cas, il s'agit du type FeedElement. Une fois que le paramètre type contient plusieurs paramètres nommés, vous pouvez les transmettre à l'attribut. Ceux-ci sont énumérés ci-dessous:
Laissant ces paramètres nommés vides par défaut, leur
La classe finale, appelée FeedRetrieverSection, dérive de ConfigurationSection et représente le
Classe publique FeedRetrieverSection: ConfigurationSection [ConfigurationProperty ("feeds", IsDefaultCollection = true)] public FeedElementCollection Feeds get return (FeedElementCollection) this ["feeds"]]; set this ["feeds"] = valeur;
Une propriété, de type FeedElementCollection et appelée Feeds, est décorée avec un ConfigurationPropertyAttribute - en la mappant à la
Une fois le gestionnaire de configuration terminé, vous pouvez ajouter les éléments appropriés à web.config. le
La prochaine étape consiste à ajouter un élément enfant à
Le suivant élément est ce que vous ajoutez à un fichier web.config, sous
Votre application est maintenant correctement configurée pour utiliser les classes FeedRetrieverSection, FeedElementCollection et FeedElement afin de vous accorder un accès par programme aux paramètres personnalisés contenus dans le fichier.
L'espace de noms System.Configuration contient une classe statique appelée ConfigurationManager. Si vous utilisez le
FeedRetrieverSection config = ConfigurationManager.GetSection ("feedRetriever") en tant que FeedRetrieverSection;
La méthode GetSection () renvoie une valeur de type Object. Elle doit donc être convertie en un type quelconque utilisé par le gestionnaire pour cette section. Ce code récupère la section nommée feedRetriever et transforme le résultat en tant que FeedRetrieverSection. Une fois que vous avez l'objet, vous pouvez commencer à accéder aux données de configuration par programme.
Pour vous donner une idée de la façon dont les paramètres de configuration peuvent être utilisés dans votre composant ou votre application, le code suivant est une implémentation très basique du composant FeedRetriever..
Classe publique FeedRetriever public static FeedRetrieverSection _Config = ConfigurationManager.GetSection ("feedRetriever") en tant que FeedRetrieverSection;
public statique void GetFeeds () foreach (FeedElement feedEl dans _Config.Feeds) // demande de requête HttpWebRequest request = (HttpWebRequest) WebRequest.Create (feedEl.Url); HttpWebResponse response = (HttpWebResponse) request.GetResponse (); if (response.StatusCode == HttpStatusCode.OK) string feedData = String.Empty; using (lecteur StreamReader = new StreamReader (response.GetResponseStream ())) feedData = reader.ReadToEnd (); if (feedEl.Cache) // nom de fichier du fichier de cache chaîne filename = String.Format ("0 _ 1 .xml", feedEl.Name, DateTime.Now.Ticks); // fichier de cache utilisant (StreamWriter writer = nouveau StreamWriter (@ "C: \" + nom du fichier)) writer.Write (feedData);
Tout d'abord, une variable statique appelée _Config de type FeedRetreiverSection est déclarée et est affectée à une valeur en appelant ConfigurationManager.GetSection (). Rendre la variable statique est un choix de conception. Ainsi, tous les membres de la classe, qu’il s’agisse d’instance ou de statique, auraient accès aux paramètres de configuration sans avoir à appeler plusieurs fois à GetSection ()..
Une fois que vous avez récupéré le gestionnaire de section avec GetSection (), vous avez un accès complet aux objets créés à partir de vos classes de gestionnaire. La première ligne de GetFeeds () est une boucle pour chaque boucle qui parcourt tous les objets FeedElement contenus avec l'objet FeedElementCollection renvoyé par la propriété Feeds. Cela vous donne un accès direct à ces objets FeedElement, ce qui facilite l'accès au nom, à l'URL et aux paramètres de cache de chaque flux..
Lors de chaque itération de la boucle, la méthode effectue une demande à l'aide de la propriété Url de l'objet FeedElement. Si la requête aboutit, les données du flux sont récupérées et stockées dans la variable feedData. Ensuite, le code vérifie la propriété Cache de l'objet FeedElement pour déterminer si le flux doit être mis en cache ou non. La mise en cache du flux implique la construction d'un nom de fichier en utilisant la propriété Name de l'objet FeedElement et la date et l'heure actuelles. Ensuite, un objet StreamWriter crée le fichier et y écrit les données du flux..
Comme vous pouvez le constater, l’utilisation des classes du gestionnaire de section de configuration est essentielle pour récupérer et utiliser les paramètres personnalisés résidant dans web.config. Cela nécessite certes plus de temps et d’efforts de votre part, mais cela facilite certainement la configuration de votre application ou de votre composant pour vous-même et les autres développeurs..
Saviez-vous que nous avons une catégorie .NET sur CodeCanyon. Si vous êtes un développeur .NET qualifié, pourquoi ne pas vendre vos scripts / composants / contrôles en tant qu'auteur et gagner entre 40 et 70% du total de vos ventes?