在 app.config 中使用 XML 包含或配置引用来包含其他配置文件的设置

Posted

技术标签:

【中文标题】在 app.config 中使用 XML 包含或配置引用来包含其他配置文件的设置【英文标题】:Use XML includes or config references in app.config to include other config files' settings 【发布时间】:2010-10-03 14:12:32 【问题描述】:

我的app.config 中有标准日志记录、NHibernate 等配置块,我想将它们提取到一个通用 XML 文件中,该文件可以作为我所有应用程序的 app.config 文件的参考。

这可能吗?

【问题讨论】:

【参考方案1】:

是的,您可以使用配置块的configSource 属性。所有配置块都有这个属性 - 虽然它没有记录。

见this article,一直在底部,附录B。下面我也贴了相关部分:

附录 B:包括外部配置文件

尽管在 .NET 2.0 的配置功能中可以找到所有优点,但也有一个缺点。在跨多个环境处理单个项目时,管理配置可能成为一场噩梦。在我目前的工作中,为多个环境(即开发、测试、登台和生产)管理配置文件的多个版本的过程涉及在将更改部署到一个或另一个环境时手动比较 .config 文件,使用手册合并过程。我花了几个月的时间试图找到一种更好的方法,最终找到了。输入一个如此受人喜爱的“无证”——或者在这种情况下,只是没有记录的——微软如此著名的特性之一:configSource。我是在使用 Reflector 这个很棒的小工具挖掘 .NET 2.0 配置源代码时才发现这个小宝石的。

每个配置节在被 .NET 配置类解析和加载时,都会被分配一个 SectionInformation 对象。 SectionInformation 对象包含有关配置节的元信息,并允许对在子配置文件 (ASP.NET) 中定义时节如何相互覆盖进行一些管理。现在,我们将忽略 SectionInformation 提供的大部分内容,保存 ConfigSource 属性。通过将configSource 属性添加到任何ConfigurationSection 的根元素,您可以指定一个备用的外部源,从中加载配置设置。

<!-- SomeProgram.exe.config -->
<configuration>
  <connectionStrings configSource="externalConfig/connectionStrings.config"/>
</configuration>

<!-- externalConfig/connectionStrings.config -->
<connectionStrings>
  <add name="conn" connectionString="blahblah" />
</connectionStrings>

在上面的配置文件中,&lt;connectionStrings&gt; 部分来自一个名为 externalConfig/connectionStrings.config 的文件。应用程序的所有连接字符串都将从指定文件加载。既然连接字符串是从外部资源加载的,那么在每个环境中的相同相对位置创建一个connectionStrings.config 文件是一件相对简单的事情。因此,connectionStrings.config 路径的 externalConfig/ 部分。这里的美妙之处在于我们可以为每个环境正确定义连接字符串一次。我们不必担心在配置文件合并不正确或根本没有合并的部署期间意外覆盖这些设置。在将应用程序中的更改部署到生产环境时,这可能是一个巨大的福音,在生产环境中存在正确的数据库连接字符串至关重要。使用configSource 属性的缺点是它需要将所有配置设置放在外部文件中。没有继承或覆盖是可能的,这在某些情况下使它无用。与configSource 属性一起使用的所有外部配置文件也必须位于主.config 文件的相对子路径中。我相信这是关于将文件存储在 Web 环境中的相对父路径中的安全问题。

另外需要注意的是&lt;appSettings&gt; 部分有一个更好的替代使用configSource,称为文件。如果您在 &lt;appSettings&gt; 部分使用文件属性而不是 configSource,则可以在根 .config 文件和引用文件中定义设置。来自根.config 文件的设置也可以在引用文件中被覆盖,只需添加具有相同键的内容即可。遗憾的是,文件属性仅在&lt;appSettings&gt; 部分可用,并且未内置到配置框架中。可以在您自己的配置部分中实现类似的属性。这将在未来的高级配置主题中讨论,在几个先决条件之后;)。

【讨论】:

you can use the configSection attribute - 我猜你的意思是 configSource? 需要注意的是,正如我刚刚发现的,它必须是物理路径,不能是 UNC 路径:(

以上是关于在 app.config 中使用 XML 包含或配置引用来包含其他配置文件的设置的主要内容,如果未能解决你的问题,请参考以下文章

如何在我的 .NET App.Config 文件中存储 XML 值

如何在 app.config xml 文件中添加 Gitlab 自定义变量

如何在 app.config 中提供 xml 文件源并从 winform 中写入/读取这些 xml 文件?

如何从 app.config 中读取自定义 XML?

关于App.config文件

为啥使用 app.config 来存储配置数据?