> 在运行时动态调整app.config:干净的方法
在应用程序开发中,动态加载的模块通常需要调整app.config
>文件。 但是,由于潜在的冲突和不稳定,通常可以避免直接改变主app.config
。
挑战:configurationManager和Caching>
类和ConfigurationManager
>命名空间使用缓存。 这意味着在初始配置负载后进行的更改可能直到应用程序重新启动后才生效。
> >以下类提供了解决此问题的解决方案。 它允许在不影响原始文件的情况下修改运行时模块的
>。
AppConfig
app.config
如何使用它
<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>
优势
>此方法提供了一种干净有效的方法来管理动态加载模块的配置。 它避免直接更改默认值<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>
以上是如何在运行时动态修改App.config文件而不影响默认设置?的详细内容。更多信息请关注PHP中文网其他相关文章!