我的app.config
中有标准的日志记录,NHibernate等配置块,我想将它们提取到一个公共的XML文件中,该文件可以作为我所有应用程序的参考文件{{1文件。
这可能吗?
答案 0 :(得分:70)
是的,您可以使用配置块的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>
在上面的配置文件中,
<connectionStrings>
部分来自名为externalConfig/connectionStrings.config
的文件。将从指定的文件加载所有应用程序的连接字符串。现在连接字符串是从外部资源加载的,在相同的相对位置的每个环境中创建connectionStrings.config
文件是相对简单的事情。因此,externalConfig/
路径的connectionStrings.config
部分。这里的美妙之处在于我们可以为每个环境正确定义连接字符串一次。在配置文件未正确合并或根本未合并的部署期间,我们不必担心会意外覆盖这些设置。将应用程序中的更改部署到生产环境时,这可能是一个巨大的好处,因为存在正确的数据库连接字符串至关重要。使用configSource
属性的缺点是它需要将所有配置设置放在外部文件中。不可能继承或覆盖,在某些情况下使其无用。与configSource
属性一起使用的所有外部配置文件也必须位于主.config
文件的相对子路径中。我相信这是关于将文件存储在Web环境中的相对父路径中的安全问题。需要注意的是,
<appSettings>
部分可以更好地替代使用configSource
,称为文件。如果使用文件属性而不是configSource和<appSettings>
部分,则可以在根.config
文件和引用文件中定义设置。根.config
文件中的设置也可以在引用的文件中被覆盖,只需添加具有相同键的内容即可。遗憾的是,file属性仅在<appSettings>
部分可用,并未构建到配置框架中。可以在您自己的配置节中实现类似的属性。在几个必备的分期付款之后,将在以后的高级配置主题中讨论这一点;)。