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

时间:2009-01-26 17:10:25

标签: c# .net configuration app-config

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

这可能吗?

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>部分可用,并未构建到配置框架中。可以在您自己的配置节中实现类似的属性。在几个必备的分期付款之后,将在以后的高级配置主题中讨论这一点;)。