2010-01-20 9 views
1

Bien qu'au nom de cette question est similaire à this et this, ce n'est pas le cas.Comment accéder à app.config/web.config pour l'application en cours?

Je développe actuellement une bibliothèque qui peut nécessiter une configuration personnalisée en fonction du souhait de l'utilisateur.

J'ai créé une section de configuration personnalisée, et tout fonctionne très bien.

Cependant, lorsque j'étais en train de déboguer, j'ai remarqué que le constructeur de la section de configuration était appelé deux fois. Et ce n'est pas ce que j'avais prévu.

Creuser plus profond, j'ai découvert qu'il a eu lieu parce que, afin d'accéder aux informations de configuration de la bibliothèque, j'utilise la méthode suivante:

var config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None); 
var section = config.GetSection("myConfigSection"); 

Avant cela, le .NET Framework a initialisé l'environnement de configuration pour l'application qui exécute la bibliothèque et appelant ainsi le constructeur de la classe MyConfigSection.

Ma question est, comment accéder aux informations déjà chargées?

Pourquoi le constructeur de la classe est appelée deux fois

Parce que je ne veux pas recharger à nouveau tout, comme le code ci-dessus fait.


Edité ajouter

Le constructeur est appelé deux fois même changer le code ci-dessus:

var section = ConfigurationManager.GetSection("myConfigSection"); 

Modifié pour clarifier

Cette question est pas un En accédant à MyConfigSection, j'y accède très bien.

La question concerne le pourquoi le constructeur de classe est appelé deux fois.


Un peu plus de précisions

Si le constructeur de la classe est appelée deux fois, le processus de chargement se produit deux fois.

Et je ne veux tout simplement pas que cela se produise. C'est ridicule.

Et oui, j'appelle les méthodes statiques du Configurationmanager selon ma première édition dans cette question.

+0

Veuillez ajouter .net à vos tags – z3cko

+0

@ z3cko vient de le faire. –

Répondre

0

Après une enquête plus approfondie, le constructeur est appelé deux fois à cause de la circonstance suivante:

  1. Le .NET Framework crée la classe quand il trouve le <section name="..." type="..." /> dans l'élément <configSections>.
  2. S'il existe une section configurée dans app.config ou web.config, le .NET Framework crée une autre instance de la classe spécifiée pour décoder la section et fusionner avec l'instance déjà créée.

Bien que cela ne fonctionne en fonction de la documentation, ce comportement pourrait entrer en conflit avec la mise en œuvre d'un ConfigurationSection si le développeur pense que seul un objet est créé au cours de la durée de vie de l'application.

Ainsi, à la suite de ce train de la pensée, si la configuration est spécifiée, disons, le machine.config, app.config et user.config l'objet sera construit trois fois afin de fusionner tout ensemble.

0

Si la configuration est déjà chargée par l'application parent, vous devriez être en mesure d'utiliser le statique GetSection droit hors du bloc:

ConfigurationManager.GetSection('myConfigSection'); 

Si ce n'est pas ce que vous vouliez, peut-être vous pouvez mieux expliquez votre situation. Vous pouvez également être intéressé par les AppSettings - http://msdn.microsoft.com/en-us/library/system.configuration.configurationmanager.appsettings.aspx

+0

Pour clarifier: La question est à propos de POURQUOI le constructeur de la classe est appelé deux fois. –

0

Vous avez posé deux questions: Pourquoi le ctor est-il appelé deux fois, et comment accéder à la configuration déjà chargée.

Vous avez déjà indiqué pourquoi il est appelé deux fois. Le système de configuration analyse le fichier de configuration lorsque l'application est chargée. Il rend cette config disponible via les membres statiques ConfigurationManager, y compris ConfigurationManager.AppSetting et ConfigurationManager.GetSection().

Vous accédez à la configuration déjà chargée en utilisant ces membres statiques.