【发布时间】:2020-09-04 17:25:17
【问题描述】:
我的问题是关于使用标准 .NET 配置对象和自定义配置元素(可以通过扩展 System.Configuration.ConfigurationSection 类来定义)。我们通常从System.Configuration.ConfigurationManager类的方法中获取这些,GetSection(...)就是一个例子。
加载的配置对象似乎是一个合并配置对象,其中包含应用程序配置文件中的设置(app.config 或 web.config 文件(开发人员可能已创建)以及 machine.config 文件中定义的内容(后者随 .NET Framework 安装提供)。
因此,我们可以假设首先使用 machine.config 以分层方式加载配置,然后任何用户定义的配置覆盖该默认设置,并且可以这样查看:
-
machine.config
- app.config(覆盖/合并 machine.config 中的相应元素)
我的目标是创建多层配置,以便在 machine.config 和 app.config 之间(如果可能的话,之后)可能还有其他配置文件强>文件:
-
machine.config
-
custom.config(在 machine.config 和 app.config 文件之间产生干扰的自定义配置)
- app.config - 现在 app.config 与 machine.config 和 custom.config 合并
-
custom.config(在 machine.config 和 app.config 文件之间产生干扰的自定义配置)
更新
重点是 - 如果我在 custom.config 和 app.config 中都定义了配置部分,我需要获得两个配置的合并版本当我打电话给ConfigurationManager.GetSection("MyCustomSection")。理想情况下,如果我能够按照this MSDN article 中的描述执行合并,那就太好了。
通常,我会编写自己的配置管理器类,并尽可能地获得所需的结果,但假设 .NET 框架可以为 machine.config 和app.config,我想我可能会从框架的内置功能中受益。此外,如果我确实应该求助于我自己的配置管理器实现,我不知道如何手动触发这种合并。
那么,是否可以利用配置部分/元素与自定义配置文件合并的内置机制?我对为自定义配置部分开发和支持这一点特别感兴趣。 System.Configuration 命名空间包含用于构建配置部分和元素的基础对象,这些对象允许与合并相关的一些设置(例如设置适当的ConfigurationElementCollectionType)。这些是否与仅与 machine.config (或 Web 应用程序中的多层 web.config 文件)合并有关,或者是否可以手动触发 pre 的合并-加载的配置文件?我试图避免在我的任何自定义配置对象中支持自定义合并,并且可能忘记支持 System.Configuration 中的现有设置...
更新
为了回应现有的答案和 cmets,我想做一个重要的澄清。我能够从当前应用程序设置 (app.config / web.config) 和我的 自定义物理文件中加载 ConfigurationSection 对象.config。我需要知道是否有机会通过框架中的一些内置方式,在不诉诸反射和逐个属性比较的情况下合并这些对象。
注意:如果有更好的解决方案可以在 .NET 3.0+ 上运行,我将不胜感激。如果您的答案针对的是更高版本的框架,请添加注释。
【问题讨论】:
-
我期待看到这个问题的答案。但我担心你所要求的是不可能的。 .NET 配置系统在配置文件拆分/模块化方面不是超级灵活。
-
@stakx,也许你是对的。尽管如此,由于 .NET 框架本身公开了合并功能(并在内部进行合并),因此至少必须能够理解这一切是如何发生的。在我的大多数项目中,我已经为简化配置做了很多工作,但这种合并功能仍然是我长期以来一直在寻找的难题中缺失的部分。
-
这不是问题的确切答案,但您可以使用具有 configSource 属性的外部卫星配置文件:msdn.microsoft.com/library/…
-
@SimonMourier,谢谢你的提示。但是,这似乎有助于将配置文件拆分到更方便的位置(除非我遗漏了什么)。我对在具有相似结构的不同配置文件之间分层设置更感兴趣 - 例如,如果 app.config 和 custom.config 都定义了元素“自定义元素”,我需要从两个文件中获取它的合并版本。当我使用
ConfigurationManager.GetSection(...)。我希望这能进一步阐明我的要求。
标签: c# .net configuration configurationmanager