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

我有我的app.config标准日志logging,NHibernate等configuration块,我想提取它们到一个通用的XML文件,可以作为我的应用程序的所有app.config文件引用。

这可能吗?

是的,您可以使用configuration块的configSection属性。 所有configuration块都有这个属性 – 虽然没有logging。

看到这篇文章 ,一直在附录B的底部。我也粘贴了下面的相关部分:

附录B:包含外部configuration文件

尽pipe在.NET 2.0的configurationfunction中可以find所有的优点,但还是有一个缺点。 在多个环境中处理单个项目时,pipe理configuration可能会变成一场噩梦。 在当前的工作中,为多个环境pipe理configuration文件的多个版本(即开发,testing,暂存和生产)的过程包括手动比较.config文件,无论何时将更改部署到一个环境或另一个环境,手动合并处理。 我花了好几个月试图find更好的方法,最终find了一个。 input其中之一,那么心爱的“无证” – 或在这种情况下,只是很lesslogging – 微软是如此着名的function: configSource 。 当我用Reflector(精彩的小工具)挖掘.NET 2.0configuration源代码时,我只是遇到了这个小小的gem。

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

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

在上面的configuration文件中, <connectionStrings>部分来自一个名为externalConfig/connectionStrings.config的文件。 所有应用程序的连接string将从指定的文件中加载。 既然连接string是从外部资源加载的,在每个环境中在相同的相对位置创build一个connectionStrings.config文件是相对简单的事情。 因此, connectionStrings.configpath的externalConfig/部分。 这里的优点是我们可以为每个环境正确定义连接string一次。 我们不必担心在configuration文件合并不当或根本没有合并的部署过程中意外覆盖这些设置。 在将应用程序中的更改部署到生产环境中时,这可能是一个巨大的恩惠,在这个环境中存在正确的数据库连接string至关重要。 使用configSource属性的configSource是需要将所有configuration设置放在外部文件中。 没有inheritance或覆盖是可能的,在某些情况下使它无用。 与configSource属性一起使用的所有外部configuration文件也必须驻留在主.config文件的相对子path中。 我相信这是关于将文件存储在Web环境中的相对父path中的安全问题。

还有一点要注意的是, <appSettings>部分有更好的select,使用configSource ,称为文件。 如果使用文件属性而不是configSource和<appSettings>部分,则可以在根.config文件和引用的文件中定义设置。 根文件中的设置也可以在引用的文件中被覆盖,只需要添加一些相同的密钥即可。 不幸的是,文件属性只适用于<appSettings>部分,并没有内置到configuration框架中。 您可以在您自己的configuration部分中实现类似的属性。 这将在几个先决条件的安装之后,在未来的高级configuration主题中进行讨论;)。