我有标准的日志记录、NHibernate 等配置块,app.config
我想将它们提取到一个通用 XML 文件中,该文件可以作为我所有应用程序app.config
文件的引用包含在内。
这可能吗?
我有标准的日志记录、NHibernate 等配置块,app.config
我想将它们提取到一个通用 XML 文件中,该文件可以作为我所有应用程序app.config
文件的引用包含在内。
这可能吗?
是的,您可以使用configSource
配置块的属性。所有配置块都有这个属性——尽管它没有被记录。
看这篇文章,一直在底部,附录B。我也粘贴了下面的相关部分:
附录 B:包括外部配置文件
尽管 .NET 2.0 的配置功能有很多优点,但也有一个缺点。在跨多个环境处理单个项目时,管理配置可能成为一场噩梦。在我目前的工作中,为多个环境(即开发、测试、登台和生产)管理配置文件的多个版本的过程涉及
.config
在将更改部署到一个或另一个环境时手动比较文件,并使用手动合并过程。我花了几个月的时间试图找到一种更好的方法,最终找到了。输入一个如此受人喜爱的“无证”——或者在这种情况下,只是没有记录的——微软如此著名的功能之一:configSource
. 我是在使用 Reflector 这个很棒的小工具挖掘 .NET 2.0 配置源代码时才发现这个小宝石的。每个配置节在被 .NET 配置类解析和加载时,都会被分配一个
SectionInformation
对象。该SectionInformation
对象包含有关配置节的元信息,并允许对在子配置文件 (ASP.NET) 中定义时节如何相互覆盖进行一些管理。现在,我们将忽略 SectionInformation 提供的大部分内容,保存ConfigSource
属性。configSource
通过向any 的根元素添加一个属性ConfigurationSection
,您可以指定一个备用的外部源,从中加载配置设置。<!-- SomeProgram.exe.config --> <configuration> <connectionStrings configSource="externalConfig/connectionStrings.config"/> </configuration> <!-- externalConfig/connectionStrings.config --> <connectionStrings> <add name="conn" connectionString="blahblah" /> </connectionStrings>
在上面的配置文件中,该
<connectionStrings>
部分来自一个名为externalConfig/connectionStrings.config
. 应用程序的所有连接字符串都将从指定文件加载。既然连接字符串是从外部资源加载的,那么connectionStrings.config
在每个环境中的相同相对位置创建一个文件是一件相对简单的事情。因此,externalConfig/
部分connectionStrings.config
小路。这里的美妙之处在于我们可以为每个环境正确定义连接字符串一次。我们不必担心在配置文件合并不正确或根本没有合并的部署期间意外覆盖这些设置。在将应用程序中的更改部署到生产环境时,这可能是一个巨大的福音,在生产环境中存在正确的数据库连接字符串至关重要。使用该configSource
属性的缺点是它需要将所有配置设置放在外部文件中。没有继承或覆盖是可能的,这在某些情况下使它无用。与该属性一起使用的所有外部配置文件configSource
也必须位于主目录的相对子路径中.config
文件。我相信这是关于将文件存储在 Web 环境中的相对父路径中的安全问题。还有一点需要注意的是,该
<appSettings>
部分有一个更好的替代使用configSource
,称为文件。如果您在节中使用文件属性而不是 configSource,则<appSettings>
可以在根.config
文件和引用文件中定义设置。根.config
文件中的设置也可以在引用文件中被覆盖,只需添加具有相同键的内容即可。遗憾的是,文件属性仅在该<appSettings>
部分中可用,并未内置到配置框架中。可以在您自己的配置部分中实现类似的属性。这将在未来的高级配置主题中讨论,在几个先决条件部分之后;)。