App.config zur Laufzeit dynamisch anpassen: Ein sauberer Ansatz
Bei der Anwendungsentwicklung erfordern dynamisch geladene Module häufig Anpassungen an der app.config
-Datei. Eine direkte Änderung des Hauptinhalts app.config
wird jedoch aufgrund möglicher Konflikte und Instabilität im Allgemeinen vermieden.
Die Herausforderung: ConfigurationManager und Caching
Die ConfigurationManager
-Klasse und der System.Configuration
-Namespace verwenden Caching. Dies bedeutet, dass Änderungen, die nach dem ersten Laden der Konfiguration vorgenommen wurden, möglicherweise erst wirksam werden, wenn die Anwendung neu gestartet wird.
Die Lösung: Die AppConfig-Klasse
Die folgende AppConfig
Klasse bietet eine Lösung für dieses Problem. Es ermöglicht das Ändern des app.config
für Laufzeitmodule, ohne dass sich dies auf die Originaldatei auswirkt.
<code class="language-csharp">public abstract class AppConfig : IDisposable { public static AppConfig Change(string path) { return new ChangeAppConfig(path); } protected abstract void Dispose(); private class ChangeAppConfig : AppConfig { private readonly string originalConfigPath = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString(); private bool disposedValue; public ChangeAppConfig(string path) { AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path); ResetConfiguration(); } public override void Dispose() { if (!disposedValue) { AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", originalConfigPath); ResetConfiguration(); disposedValue = true; } GC.SuppressFinalize(this); } private static void ResetConfiguration() { // Resetting internal ConfigurationManager state to reload config typeof(ConfigurationManager) .GetField("s_initState", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, 0); typeof(ConfigurationManager) .GetField("s_configSystem", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, null); typeof(ConfigurationManager) .Assembly.GetTypes() .Where(x => x.FullName == "System.Configuration.ClientConfigPaths") .First() .GetField("s_current", BindingFlags.NonPublic | BindingFlags.Static) .SetValue(null, null); } } }</code>
Wie man es benutzt
<code class="language-csharp">// Temporary config modification using (AppConfig.Change(temporaryConfigPath)) { // Access and use the modified configuration } // Permanent config modification (replace default) AppConfig.Change(newConfigPath);</code>
Vorteile
Diese Methode bietet eine saubere und effiziente Möglichkeit, die Konfiguration für dynamisch geladene Module zu verwalten. Es vermeidet eine direkte Änderung der Standardeinstellung app.config
, sorgt für Stabilität und verhindert Konflikte. Durch die unkomplizierte Implementierung ist es an verschiedene Szenarien anpassbar, die Änderungen der Laufzeitkonfiguration erfordern.
Das obige ist der detaillierte Inhalt vonWie kann ich eine App.config-Datei zur Laufzeit dynamisch ändern, ohne die Standardeinstellungen zu beeinträchtigen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!