94 votes

Variables au sein de l'app.config/web.config

Est-il est possible de faire quelque chose comme ce qui suit dans l' app.config ou web.config fichiers?

<appSettings>
 <add key="MyBaseDir" value="C:\MyBase" />
 <add key="Dir1" value="[MyBaseDir]\Dir1"/>
 <add key="Dir2" value="[MyBaseDir]\Dir2"/>
</appSettings>

Je veux accéder à Dir2 dans mon code en disant simplement:

 ConfigurationManager.AppSettings["Dir2"]

Cela va m'aider quand j'ai installer mon application dans les différents serveurs et des endroits où je n'aurai que pour modifier UNE entrée de toute ma app.config. (Je sais que je peux gérer l'ensemble de la concaténation dans le code, mais je préfère de cette façon).

22voto

Matt Hamsmith Points 2285

Un peu plus compliqué, mais beaucoup plus flexible, la solution consiste à créer une classe qui représente une section de configuration. Dans votre app.config / web.config le fichier, vous pouvez avoir ceci:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <!-- This section must be the first section within the <configuration> node -->
    <configSections>
        <section name="DirectoryInfo" type="MyProjectNamespace.DirectoryInfoConfigSection, MyProjectAssemblyName" />
    </configSections>

    <DirectoryInfo>
        <Directory MyBaseDir="C:\MyBase" Dir1="Dir1" Dir2="Dir2" />
    </DirectoryInfo>
</configuration>

Puis, dans votre .NET code (je vais utiliser le C# dans mon exemple), vous pouvez créer deux classes comme ceci:

using System;
using System.Configuration;

namespace MyProjectNamespace {

    public class DirectoryInfoConfigSection : ConfigurationSection {

        [ConfigurationProperty("Directory")]
        public DirectoryConfigElement Directory {
            get {
                return (DirectoryConfigElement)base["Directory"];
            }
    }

    public class DirectoryConfigElement : ConfigurationElement {

        [ConfigurationProperty("MyBaseDir")]
        public String BaseDirectory {
            get {
                return (String)base["MyBaseDir"];
            }
        }

        [ConfigurationProperty("Dir1")]
        public String Dir1 {
            get {
                return (String)base["Dir1"];
            }
        }

        [ConfigurationProperty("Dir2")]
        public String Dir2 {
            get {
                return (String)base["Dir2"];
            }
        }
        // You can make custom properties to combine your directory names.
        public String Dir1Resolved {
            get {
                return System.IO.Path.Combine(MyBaseDir, Dir1);
            }
        }
    }
}

Enfin, dans le code de votre programme, vous pouvez accéder à votre app.config variables, à l'aide de vos nouvelles classes, de cette manière:

DirectoryInfoConfigSection config =
  (DirectoryInfoConfigSection)ConfigurationManager.GetSection("DirectoryInfo");
String dir1Path = config.Directory.Dir1Resolved;  // This value will equal "C:\MyBase\Dir1"

18voto

anderly Points 193

Vous pouvez accomplir à l'aide de mon Vaste bibliothèque: http://nuget.org/List/Packages/Expansive Source est disponible ici: https://github.com/anderly/Expansive

7voto

Arjan Einbu Points 7941

Bonne question.

Je ne pense pas qu'il y est. Je crois qu'il aurait été tout à fait bien connu, si il y avait un moyen facile, et je vois que Microsoft est la création d'un mécanisme de Visual Studio 2010 pour le déploiement de différents fichiers de configuration pour le déploiement et le test.

Cela étant dit, cependant, j'ai trouvé que vous en ConnectionStrings section ont une sorte d'espace réservé appelée "|DataDirectory|". Peut-être que vous pourriez avoir un coup d'oeil à ce qui est à l'œuvre là-bas...

Voici une pièce de machine.config montrant:

 <connectionStrings>
    <add
        name="LocalSqlServer"
        connectionString="data source=.\SQLEXPRESS;Integrated Security=SSPI;AttachDBFilename=|DataDirectory|aspnetdb.mdf;User Instance=true"
        providerName="System.Data.SqlClient"
    />
 </connectionStrings>

4voto

Scott Weinstein Points 11404

J'ai pensé que je viens juste de voir cette question.

En bref, non, il n'y a pas d'interpolation de variable à l'intérieur d'une configuration de l'application.

Vous avez deux options

  1. Vous pourriez rouler à substituer des variables lors de l'exécution
  2. Au moment de la construction, de massage la configuration de l'application pour le particulier spécificités de l'environnement de déploiement cible. Quelques détails sur cette question à traiter avec la configuration-cauchemar

3voto

JoshBerke Points 34238

Vous avez deux options. Vous pouvez le faire avec un build / déployer étape qui permettrait de traiter votre fichier de configuration pour le remplacement de vos variables avec la valeur correcte.

Une autre option serait de définir votre propre section de Configuration qui a soutenu cette. Par exemple, imaginez ce xml:

<variableAppSettings>
 <variables>
    <add key="@BaseDir" value="c:\Programs\Widget"/>
 </variables>
 <appSettings>
    <add key="PathToDir" value="@BaseDir\Dir1"/>
 </appSettings>
</variableAppSettings>

Maintenant, vous devez mettre en œuvre ce, en utilisant des objets de configuration qui permettrait de gérer en remplaçant les variables par vous au moment de l'exécution.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X