2010-06-06 13 views
0

J'ai une classe qui doit obtenir certains paramètres du fichier de configuration de l'application et qui est utilisé dans une application basée sur la console et une application Web.Comment mon application .Net peut-elle déterminer si utiliser app.config ou web.config

autres que d'attraper une exception comment puis-je déterminer si vous souhaitez utiliser:

ServiceModelSectionGroup serviceModelSectionGroup = ServiceModelSectionGroup.GetSectionGroup(ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None)); 

ou

ServiceModelSectionGroup serviceModelSectionGroup = ServiceModelSectionGroup.GetSectionGroup(WebConfigurationManager.OpenWebConfiguration("~")); 
+4

Peut-être que je manque quelque chose - pourquoi ne pouvez-vous pas utiliser 'ConfigurationManager.GetSection()'? – roufamatic

+0

J'ai besoin de lister les noeuds finaux du client dans le noeud de configuration system.serviceModel et je ne pense pas que la méthode GetSection me permette d'extraire ce noeud en tant qu'objet ServiceModelSectionGroup. – sipwiz

+1

vous pouvez l'obtenir comme 'SectionGroup' et _cast_ à' ServiceModelSectionGroup'. – Oded

Répondre

4

J'ai fait le tour et il semble que vous ne pouvez pas faire ce que vous voulez parce que le modèle web est différent du modèle d'application. Assez surprenant qu'ils n'offrent pas le cas habituel pour cela.

Je voudrais ajouter un paramètre Configuration au constructeur de votre classe et injecter la dépendance du code appelant.

1

Bien que je ne connais pas exactement ce que vous essayez de faire, je pense est qu'il existe un moyen d'obtenir la section config sans spécifier explicitement quelle configuration utiliser (app.config vs web.config). Comme vous pouvez utiliser ConfigurationManager.AppSettings pour récupérer des valeurs indépendamment du fait que votre application soit ou non une application Web, pourriez-vous utiliser ConfigurationManager.GetSection("system.serviceModel")? Si cela ne fonctionne pas, je suppose que la chose la plus simple serait de simplement vérifier si System.Web.HttpContext.Current est nulle (assurez-vous d'ajouter une référence à System.Web), alors vous pouvez choisir quelle configuration utiliser.

0

Vous pouvez vérifier HttpContext, mais il existe des cas où vous hébergez des services WCF où, selon l'endroit où vous effectuez l'appel, vous ne verrez pas de HttpContext. Pour ce faire, je vérifie généralement le processus d'hébergement pour voir si c'est IIS ou Cassini - le gotcha avec cette approche est d'avoir à se soucier de la mise à jour de la bibliothèque lorsque de nouvelles versions OS ou de nouvelles versions de VS sortent.

0

HostingEnvironment.IsHosted La propriété semble fournir exactement les informations dont vous avez besoin. De MSDN:

HostingEnvironment.IsHosted Propriété

obtient une valeur indiquant si le domaine d'application actuel est hébergé par un objet ApplicationManager.

utilisant, votre code devient:

Configuration configuration = HostingEnvironment.IsHosted 
    ? WebConfigurationManager.OpenWebConfiguration("~") 
    : ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None) 

ServiceModelSectionGroup serviceModelSectionGroup = 
    ServiceModelSectionGroup.GetSectionGroup(configuration);