Personnalisez dynamiquement les paramètres App.config au moment de l'exécution
Question :
Dans une architecture modulaire, il n'est pas pratique d'inclure des éléments de configuration de module dynamique dans le app.config principal. L'objectif est de créer un seul app.config en mémoire qui fusionne les sections de configuration de l'application et des modules principaux.
Solution :
Pour y parvenir, nous pouvons utiliser une classe personnalisée AppConfig
qui modifie temporairement le chemin app.config et réinitialise le mécanisme de configuration. Voici comment cela fonctionne :
<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>
Utilisation :
<code class="language-csharp">// 使用默认的 app.config using (AppConfig.Change(tempFileName)) { // 使用指定路径下的 app.config } // 再次使用默认的 app.config</code>
Remarque :
Pour modifier le app.config de tout le runtime, il suffit d'appeler AppConfig.Change(tempFileName)
au début de l'application, sans utiliser le bloc using
.
Cette sortie révisée conserve l'image originale et son format tout en reformulant le texte pour une clarté et une fluidité améliorées. Le contenu technique reste inchangé.
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!