Ist es möglich, in den Dateien app.config
oder Folgendes zu tun web.config
?
<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 hilft mir, wenn ich meine Anwendung auf verschiedenen Servern und Standorten installiere, an denen ich nur EINEN Eintrag in meinem gesamten ändern muss app.config
. (Ich weiß, dass ich die gesamte Verkettung im Code verwalten kann, aber ich bevorzuge es auf diese Weise).
c#
variables
web-config
app-config
DeeStackOverflow
quelle
quelle
Antworten:
Gute Frage.
Ich glaube nicht. Ich glaube, es wäre ziemlich bekannt gewesen, wenn es einen einfachen Weg gegeben hätte, und ich sehe, dass Microsoft in Visual Studio 2010 einen Mechanismus zum Bereitstellen verschiedener Konfigurationsdateien für die Bereitstellung und den Test erstellt.
Nachdem dies gesagt wurde; Ich habe festgestellt, dass Sie in diesem
ConnectionStrings
Abschnitt eine Art Platzhalter namens "| DataDirectory |" haben. Vielleicht könnten Sie einen Blick darauf werfen, was dort am Werk ist ...Hier ist ein Stück
machine.config
davon:quelle
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 Folgendes haben:Anschließend können Sie in Ihrem .NET-Code (in meinem Beispiel C #) zwei Klassen wie die folgende erstellen:
Schließlich können Sie in Ihrem Programmcode
app.config
mithilfe Ihrer neuen Klassen auf folgende Weise auf Ihre Variablen zugreifen :quelle
Sie können mit meiner Bibliothek Expansive erreichen . Auch hier auf Nuget erhältlich .
Es wurde mit diesem als primären Anwendungsfall entworfen.
Moderates Beispiel (Verwenden von AppSettings als Standardquelle für die Token-Erweiterung)
In app.config:
Verwenden Sie die Erweiterungsmethode .Expand () für die zu erweiternde Zeichenfolge:
oder
Verwenden Sie den Dynamic ConfigurationManager-Wrapper "Config" wie folgt (expliziter Aufruf von Expand () nicht erforderlich):
Erweitertes Beispiel 1 (Verwenden von AppSettings als Standardquelle für die Token-Erweiterung)
In app.config:
Verwenden Sie die Erweiterungsmethode .Expand () für die zu erweiternde Zeichenfolge:
quelle
Ich dachte, ich hätte gerade diese Frage gesehen.
Kurz gesagt, nein, es gibt keine variable Interpolation innerhalb einer Anwendungskonfiguration.
Sie haben zwei Möglichkeiten
quelle
Sie haben mehrere Möglichkeiten. Sie können dies mit einem Build / Deploy-Schritt tun, bei dem Ihre Konfigurationsdatei verarbeitet wird und Ihre Variablen durch den richtigen Wert ersetzt werden.
Eine andere Möglichkeit wäre, einen eigenen Konfigurationsabschnitt zu definieren, der dies unterstützt. Stellen Sie sich zum Beispiel diese XML vor:
Jetzt würden Sie dies mithilfe benutzerdefinierter Konfigurationsobjekte implementieren, mit denen die Variablen zur Laufzeit für Sie ersetzt werden.
quelle
Normalerweise schreibe ich eine statische Klasse mit Eigenschaften, um auf alle Einstellungen meiner web.config zuzugreifen.
Normalerweise schreibe ich bei Bedarf auch Konvertierungen in dieser Klasse. Es ermöglicht einen typisierten Zugriff auf Ihre Konfiguration. Wenn sich die Einstellungen ändern, können Sie sie nur an einer Stelle bearbeiten.
Normalerweise ist das Ersetzen von Einstellungen durch diese Klasse relativ einfach und bietet eine viel bessere Wartbarkeit.
quelle
Sie können Umgebungsvariablen in Ihrem
app.config
für das von Ihnen beschriebene Szenario verwendenDann können Sie den Pfad leicht finden mit:
quelle
Im Inneren können
<appSettings>
Sie Anwendungsschlüssel erstellen,Später können Sie auf diese Werte zugreifen, indem Sie:
quelle
Ich würde Ihnen DslConfig vorschlagen . Mit DslConfig können Sie hierarchische Konfigurationsdateien von Global Config, Config per Server Host verwenden, um pro Anwendung auf jedem Server Host zu konfigurieren (siehe AppSpike).
Wenn dies für Sie zu kompliziert ist, können Sie einfach die globale Konfiguration Variables.var verwenden.
Konfigurieren Sie einfach in Varibales.var
Und holen Sie sich die Konfigurationswerte mit
quelle
Ich glaube nicht, dass Sie Variablen deklarieren und verwenden können, um AppSettings-Schlüssel in einer Konfigurationsdatei zu definieren. Ich habe immer Verkettungen in Code wie Sie verwaltet.
quelle
Ich habe ein wenig Probleme mit dem, was Sie möchten, aber Sie können den App-Einstellungen eine Überschreibungsdatei hinzufügen und diese Überschreibungsdatei dann auf Umgebungsbasis festlegen.
quelle
Für die Einführung von Produkten, bei denen viele Elemente mit ähnlichen Werten konfiguriert werden müssen, verwenden wir kleine Konsolen-Apps, die das XML lesen und basierend auf den übergebenen Parametern aktualisieren. Diese werden dann vom Installationsprogramm aufgerufen, nachdem der Benutzer nach dem gefragt wurde Benötigte Information.
quelle
Ich würde empfehlen, Matt Hamsmiths Lösung zu folgen. Wenn die Implementierung ein Problem darstellt, können Sie eine Erweiterungsmethode erstellen, die dies im Hintergrund der AppSettings-Klasse implementiert.
Etwas wie:
Innerhalb der Methode durchsuchen Sie den DictionaryInfoConfigSection mit Linq und geben den Wert mit dem passenden Schlüssel zurück. Sie müssen die Konfigurationsdatei jedoch auf folgende Weise aktualisieren:
quelle
Ich habe mir diese Lösung ausgedacht:
Ich bin mit dieser Lösung nicht wirklich zufrieden, da ich alle Attribute manuell ändern muss. Wenn ich ein neues hinzufüge, muss ich es in der app.xaml.cs.
Hier ein Code-Snippet aus der App.xaml.cs:
AKTUALISIEREN
Habe gerade eine Verbesserung gefunden (wieder ein Code-Snippet aus der app.xaml.cs):
Jetzt funktionieren die Ersetzungen für alle Attribute in meinen Einstellungen, die Type = string und Scope = User haben. Ich denke, ich mag es so.
UPDATE2
Anscheinend ist das Setzen von Scope = Application nicht erforderlich, wenn die Eigenschaften ausgeführt werden.
quelle
Drei mögliche Lösungen
Für dieses Beispiel habe ich die folgende App-Einstellung in einer Konsolenanwendung verwendet:
1. Verwenden Sie Umgebungsvariablen
Erstellen Sie ein Pre-Build-Ereignis, das die MSBuild-Variablen verwendet
SETX BaseDir "$(ProjectDir)"
Variablen zurücksetzen; mit etwas wie dem folgenden:
Umgebungsvariablen beim Stapelüberlauf aktualisieren
Verwenden Sie die Einstellung in Ihrem Code:
'
'
2. Verwenden Sie die Zeichenfolgeninterpolation:
Verwenden Sie die Funktion string.Format ()
`
`
3. Verwenden einer statischen Klasse. Dies ist die Lösung, die ich am häufigsten verwende.
Die Umsetzung
`
`
Die statische Klasse
`
`
Projektnummer:
App.config:
Program.cs
Pre-Build-Ereignis:
Projekteinstellungen -> Ereignisse erstellen
quelle