Ajustement dynamiquement APP.config à l'exécution: une approche propre
Dans le développement d'applications, les modules chargés dynamiquement nécessitent souvent des ajustements au fichier app.config
. Cependant, la modification directe du principal app.config
est généralement évité en raison des conflits potentiels et de l'instabilité.
Le défi: ConfigurationManager et mise en cache
La classe ConfigurationManager
et l'espace de noms System.Configuration
utilisent la mise en cache. Cela signifie que les modifications apportées après la charge de configuration initiale peuvent ne pas prendre effet jusqu'à ce que l'application redémarre.
La solution: la classe AppConfig
La classe AppConfig
suivante fournit une solution à ce problème. Il permet de modifier le app.config
pour les modules d'exécution sans affecter le fichier d'origine.
<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>
comment l'utiliser
<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>
Avantages
Cette méthode offre un moyen propre et efficace de gérer la configuration pour les modules chargés dynamiquement. Il évite de modifier directement la valeur par défaut app.config
, assurant la stabilité et la prévention des conflits. Son implémentation simple le rend adaptable à divers scénarios nécessitant des modifications de configuration d'exécution.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!