运行时动态自定义 App.config 设置
问题:
在模块化架构中,在主 app.config 中包含动态模块的配置项很不方便。目标是创建一个单独的内存中 app.config,它合并来自主应用程序和模块的配置节。
解决方案:
为了实现这一点,我们可以使用一个自定义类 AppConfig
,它临时更改 app.config 路径并重置配置机制。以下是它的工作原理:
<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>
用法:
<code class="language-csharp">// 使用默认的 app.config using (AppConfig.Change(tempFileName)) { // 使用指定路径下的 app.config } // 再次使用默认的 app.config</code>
注意:
要更改整个运行时的 app.config,只需在应用程序的开头调用 AppConfig.Change(tempFileName)
,无需使用 using
块。
This revised output maintains the original image and its format while rewording the text for improved clarity and flow. The technical content remains unchanged.
以上是如何在模块化体系结构中在运行时动态自定义app.config设置?的详细内容。更多信息请关注PHP中文网其他相关文章!