2009-01-26 99 views

回答

69

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

this article,在底部一路,附录B.我还粘贴了以下相关的部分:

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

尽管所有的伟大在.NET 2.0的配置功能中,有一个缺点。在多个环境中处理单个项目时,管理配置可能会变成一场噩梦。在当前工作中管理多个环境配置文件的多个版本(即开发,测试,分期和生产)的过程包括手动比较.config文件,无论何时将更改部署到一个或另一个环境,并进行手动合并过程。我花了好几个月试图找到更好的方法,最终找到了一个。输入其中之一 - 如此受人喜爱的“无证” - 或者在这种情况下,只是记录不完善 - 微软因其出名的特征而已:configSource。当我使用反射器,精彩的小工具深入研究.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文件是一件相对简单的事情。因此,connectionStrings.config路径的externalConfig/部分。这里的美妙之处在于我们可以为每个环境正确定义连接字符串一次。我们不必担心在配置文件合并不当或完全不合并的部署期间意外覆盖这些设置。在将应用程序中的更改部署到生产环境中时,这可能是一个巨大的恩惠,在这种环境中,存在正确的数据库连接字符串至关重要。使用configSource属性的缺点是需要将所有配置设置放置在外部文件中。没有继承或覆盖是可能的,这在某些情况下使它无用。与configSource属性一起使用的所有外部配置文件还必须驻留在主文件.config的相对子路径中。我相信这是关于将文件存储在Web环境中的相对父路径中的安全问题。

还有一点要注意的是<appSettings>部分有一个更好的替代使用configSource,称为文件。如果使用<appSettings>部分的文件属性而不是configSource,则可以在根文件.config和参考文件中定义设置。根文件中的设置也可以在参考文件中重写,只需使用相同的密钥添加。不幸的是,文件属性仅在<appSettings>部分可用,并且不在配置框架中。可以在您自己的配置部分中实现类似的属性。这将在几个先决条件安装之后的未来高级配置主题中进行讨论;)。

+0

'你可以使用configSection属性' - 我假设你的意思是*`configSource` *? – Geoff 2016-08-26 14:31:41

相关问题