99 Stimmen

Variablen in app.config/web.config

Ist es möglich, etwas wie das Folgende in der app.config o web.config Dateien?

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

Ich möchte dann in meinem Code auf Dir2 zugreifen, indem ich einfach sage:

 ConfigurationManager.AppSettings["Dir2"]

Dies wird mir helfen, wenn ich meine Anwendung auf verschiedenen Servern und an verschiedenen Standorten installiere, da ich nur EINEN Eintrag in meiner gesamten Anwendung ändern muss. app.config . (Ich weiß, dass ich die gesamte Verkettung im Code verwalten kann, aber ich bevorzuge diesen Weg).

1 Stimmen

Ich glaube, er meint damit die Definition von Variablen, die in appSettings-Schlüsseln direkt in den Konfigurationsdateien verwendet werden sollen.

1 Stimmen

Ich habe auch die Verwendung der XML <!ENTITY>-Deklaration ausprobiert, aber sie wird aufgrund der Art und Weise, wie MS web.config-Dateien behandelt, nicht unterstützt.

0 Stimmen

Vielen Dank für Ihre Bemühungen. Ich ziehe es vor, keinen Code zu ändern. Der Code enthält bereits eine Anweisung, die lautet: string dir2=ConfigurationManager.AppSettings["Dir2"]. Ich möchte nur die app.config bereinigen, in der jetzt value=" steht. D:\blahdir\Dir2 " anstelle von value="[MyBaseDir] \Dir2 "

24voto

Matt Hamsmith Punkte 3845

Eine etwas kompliziertere, aber weitaus flexiblere Alternative besteht darin, eine Klasse zu erstellen, die einen Konfigurationsabschnitt darstellt. In Ihrer app.config / web.config Datei, können Sie dies haben:

<?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>

Dann können Sie in Ihrem .NET-Code (ich verwende in meinem Beispiel C#) zwei Klassen wie folgt erstellen:

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 Directory1 {
            get {
                return (String)base["Dir1"];
            }
        }

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

Schließlich können Sie in Ihrem Programmcode auf Ihre app.config Variablen unter Verwendung Ihrer neuen Klassen auf diese Weise:

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

1 Stimmen

Danke, aber ich versuche, dies zu tun, ohne irgendeinen Code zu ändern, da es in diesem Stadium eine Qual ist.

0 Stimmen

In der letzten Zeile des Codes ist ein kleiner Fehler (ohne Klammern): "return System.IO.Path.Combine(MyBaseDir, Dir1);" sollte stattdessen "return System.IO.Path.Combine(BaseDirectory , Dir1);" lauten, andernfalls sollte die Methode von 'Base Directory' in 'MyBaseDir' umbenannt werden

19voto

anderly Punkte 697

Sie können mit meiner Bibliothek Folgendes erreichen Ausgedehnte . Auch auf nuget verfügbar aquí .

Sie wurde für diesen primären Anwendungsfall entwickelt.

Moderates Beispiel (mit AppSettings als Standardquelle für die Token-Erweiterung)

In app.config:

<configuration>
    <appSettings>
        <add key="Domain" value="mycompany.com"/>
        <add key="ServerName" value="db01.{Domain}"/>
    </appSettings>
    <connectionStrings>
        <add name="Default" connectionString="server={ServerName};uid=uid;pwd=pwd;Initial Catalog=master;" provider="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

Verwenden Sie die .Expand() Erweiterungsmethode auf die zu erweiternde Zeichenkette:

var connectionString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
connectionString.Expand() // returns "server=db01.mycompany.com;uid=uid;pwd=pwd;Initial Catalog=master;"

o

Verwenden Sie den Dynamic ConfigurationManager Wrapper "Config" wie folgt (expliziter Aufruf von Expand() nicht erforderlich):

var serverName = Config.AppSettings.ServerName;
// returns "db01.mycompany.com"

var connectionString = Config.ConnectionStrings.Default;
// returns "server=db01.mycompany.com;uid=uid;pwd=pwd;Initial Catalog=master;"

Erweitertes Beispiel 1 (Verwendung von AppSettings als Standardquelle für die Token-Erweiterung)

In app.config:

<configuration>
    <appSettings>
        <add key="Environment" value="dev"/>
        <add key="Domain" value="mycompany.com"/>
        <add key="UserId" value="uid"/>
        <add key="Password" value="pwd"/>
        <add key="ServerName" value="db01-{Environment}.{Domain}"/>
        <add key="ReportPath" value="\\{ServerName}\SomeFileShare"/>
    </appSettings>
    <connectionStrings>
        <add name="Default" connectionString="server={ServerName};uid={UserId};pwd={Password};Initial Catalog=master;" provider="System.Data.SqlClient" />
    </connectionStrings>
</configuration>

Verwenden Sie die Erweiterungsmethode .Expand() für die zu erweiternde Zeichenfolge:

var connectionString = ConfigurationManager.ConnectionStrings["Default"].ConnectionString;
connectionString.Expand() // returns "server=db01-dev.mycompany.com;uid=uid;pwd=pwd;Initial Catalog=master;"

4 Stimmen

Ich denke, diese Antwort ist sehr unterbewertet!!

0 Stimmen

Danke Ahmad! Lass mich wissen, wie dir Expansive gefällt.

0 Stimmen

Obwohl es sich hierbei um eine "Auflösung" der Anwendungseinstellungen zur Laufzeit handelt, löst es meine Probleme mit den sich wiederholenden Schlüssel-Wert-Paaren. Wir haben unsere Konfiguration Wartung mit diesem erheblich reduzieren. Die absolute Utopie hier wäre, dies zu haben, ein Build-Zeit-Plugin in Verbindung mit SlowCheetah arbeiten. Ich würde +1 wieder, wenn ich könnte. Großartige Sache anderly.

7voto

Arjan Einbu Punkte 13269

Gute Frage.

Ich glaube nicht, dass es das gibt. Ich glaube, es wäre ziemlich bekannt, wenn es einen einfachen Weg gäbe, und ich sehe, dass Microsoft in Visual Studio 2010 einen Mechanismus für die Bereitstellung verschiedener Konfigurationsdateien für die Bereitstellung und den Test erstellt.

Allerdings habe ich festgestellt, dass Sie in der ConnectionStrings Abschnitt haben eine Art Platzhalter namens "|DataDirectory|". Vielleicht können Sie sich ansehen, was dort vor sich geht...

Hier ist ein Beitrag von machine.config die es zeigen:

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

0 Stimmen

Das ist eine interessante Information. Vielleicht wird auf Variablen mit dem Pipe-Symbol ("|") zugegriffen? Hmm. Ich frage mich, ob das funktioniert: <add key="Dir2" value="|MeinBasisVerzeichnis| \Dir2 "/>

4 Stimmen

Der Wert DataDirectory ist eigentlich ein Datenelement in der AppDomain. Sie könnten den Wert überschreiben, indem Sie AppDomain.CurrentDomain.SetData("DataDirectory", dataPath) verwenden; ich habe nicht getestet, ob Sie andere Variablen wie diese definieren und sie "autoexpanded" though...

5voto

Scott Weinstein Punkte 18520

Ich dachte, ich hätte diese Frage gerade gesehen.

Kurz gesagt, nein, es gibt keine variable Interpolation innerhalb einer Anwendungskonfiguration.

Sie haben zwei Möglichkeiten

  1. Sie können Ihre eigene Methode entwickeln, um Variablen zur Laufzeit zu ersetzen
  2. Zum Zeitpunkt der Erstellung wird die Anwendungskonfiguration an die besonderen Gegebenheiten der Zielverteilungsumgebung angepasst. Einige Details dazu unter Umgang mit dem Konfigurations-Albtraum

0 Stimmen

Dies ist die richtige Stelle. In meinem vorherigen Beitrag (dieselbe Frage) war das Beispiel für den app.config xml-Eintrag nicht enthalten. Ich überprüfte Ihren Link - es ist zu viel Arbeit und bevorzugen Sie nicht Zeit dort zu verbringen.wir haben separate app.configs für verschiedene Boxen und ich möchte weg von dem zu bekommen.

4voto

Martin Punkte 5651

Normalerweise schreibe ich am Ende eine statische Klasse mit Eigenschaften, um auf jede der Einstellungen meiner web.config zuzugreifen.

public static class ConfigManager 
{
    public static string MyBaseDir
    {
        return ConfigurationManager.AppSettings["MyBaseDir"].toString();
    }

    public static string Dir1
    {
        return MyBaseDir + ConfigurationManager.AppSettings["Dir1"].toString();
    }

}

Normalerweise führe ich in dieser Klasse bei Bedarf auch Typumwandlungen durch. Dies ermöglicht einen typisierten Zugang zu Ihrer Konfiguration, und wenn sich Einstellungen ändern, können Sie sie an nur einer Stelle bearbeiten.

Normalerweise ist das Ersetzen von Einstellungen durch diese Klasse relativ einfach und bietet eine viel bessere Wartbarkeit.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X