Heim >Backend-Entwicklung >C++ >Wie kann ich App.config-Einstellungen zur Laufzeit in einer modularen Architektur dynamisch anpassen?

Wie kann ich App.config-Einstellungen zur Laufzeit in einer modularen Architektur dynamisch anpassen?

Barbara Streisand
Barbara StreisandOriginal
2025-01-25 17:41:10390Durchsuche

How Can I Dynamically Customize App.config Settings at Runtime in a Modular Architecture?

App.config-Einstellungen zur Laufzeit dynamisch anpassen

Frage:

In einer modularen Architektur ist es unpraktisch, dynamische Modulkonfigurationselemente in die Haupt-app.config aufzunehmen. Das Ziel besteht darin, eine einzelne app.config im Arbeitsspeicher zu erstellen, die Konfigurationsabschnitte aus der Hauptanwendung und den Modulen zusammenführt.

Lösung:

Um dies zu erreichen, können wir eine benutzerdefinierte Klasse AppConfig verwenden, die den app.config-Pfad vorübergehend ändert und den Konfigurationsmechanismus zurücksetzt. So funktioniert es:

<code class="language-csharp">public abstract class AppConfig : IDisposable
{
    public static AppConfig Change(string path)
    {
        return new ChangeAppConfig(path);
    }

    public abstract void Dispose();

    private class ChangeAppConfig : AppConfig
    {
        private readonly string oldConfig;

        public ChangeAppConfig(string path)
        {
            oldConfig = AppDomain.CurrentDomain.GetData("APP_CONFIG_FILE").ToString();
            AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", path);
            ResetConfigMechanism();
        }

        public override void Dispose()
        {
            AppDomain.CurrentDomain.SetData("APP_CONFIG_FILE", oldConfig);
            ResetConfigMechanism();
        }

        private static void ResetConfigMechanism()
        {
            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>

Verwendung:

<code class="language-csharp">// 使用默认的 app.config
using (AppConfig.Change(tempFileName))
{
    // 使用指定路径下的 app.config
}
// 再次使用默认的 app.config</code>

Hinweis:

Um die app.config der gesamten Laufzeit zu ändern, rufen Sie einfach AppConfig.Change(tempFileName) am Anfang der Anwendung auf, ohne den using-Block zu verwenden.

Diese überarbeitete Ausgabe behält das Originalbild und sein Format bei, während der Text für mehr Klarheit und Fluss neu formuliert wird. Der technische Inhalt bleibt unverändert.

Das obige ist der detaillierte Inhalt vonWie kann ich App.config-Einstellungen zur Laufzeit in einer modularen Architektur dynamisch anpassen?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn