Asp.net mvc 层次结构中的多个AppSettings.config文件

Asp.net mvc 层次结构中的多个AppSettings.config文件,asp.net-mvc,configuration,asp.net-mvc-4,appsettings,Asp.net Mvc,Configuration,Asp.net Mvc 4,Appsettings,在创建ASP.NETMVC应用程序时,我有一个问题曾多次遇到:假设您有一个应用程序要部署到多个客户。应用程序代码是相同的,但您希望每个客户都有一个appSettings.config文件,这样您就可以通过更改web.config中appSettings标记的configSource来部署到不同的客户(虽然有点简化,但仍然如此) 然后您会意识到appSettings.config中50%的内容对所有客户都是通用的,只有50%的内容依赖于客户。您可能会在所有appSettings文件中都有重复的条目

在创建ASP.NETMVC应用程序时,我有一个问题曾多次遇到:假设您有一个应用程序要部署到多个客户。应用程序代码是相同的,但您希望每个客户都有一个appSettings.config文件,这样您就可以通过更改web.config中appSettings标记的configSource来部署到不同的客户(虽然有点简化,但仍然如此)

然后您会意识到appSettings.config中50%的内容对所有客户都是通用的,只有50%的内容依赖于客户。您可能会在所有appSettings文件中都有重复的条目,这是一个主要的陷阱,因为如果您想在应用程序范围内更改配置,则需要记住更新所有条目

在这种情况下,我真的希望有某种层次结构的系统,您可以在单独的文件中有一个“基本配置”和一个“客户配置”。然后,我希望ConfigurationManager首先检查customer配置中的值,如果没有在那里定义该值,它将转到基本配置

在ASP.NETMVC4中,我还没有找到一种直接的方法来解决这个问题。它是否存在,或者我是否需要以某种方式绕过默认的ConfigurationManager类?我可以创建自己的类,并用对自己实现的调用替换对ConfigurationManager.AppSettings[key]的所有调用,但如果可以,我宁愿避免这样做。我希望能够利用内置ConfigurationManager处理的一些基本功能,如缓存等


有谁曾经解决过类似的问题?我一直认为这似乎是一个常见的场景。

这是一个常见的场景,有不同的方法来解决它。一种方法是使用。您可以有一个
Web.Customer1.config
Web.Customer2.config
等,就像您有
Web.Debug.config
Web.Release.config
一样。在客户特定的转换文件中,您可以仅“覆盖”客户希望自定义的
appSettings

要创建不同的转换,请首先创建不同的项目平台。转到Visual Studio配置管理器,在web项目(或任何需要自定义配置设置的项目)的
配置
列中,单击下拉列表,然后单击
。将新的项目配置命名为
Customer1
或任何您想要的名称,选中
复制设置框,然后从该下拉列表中选择
Release
。同时选中
创建新的解决方案配置
复选框

最后,右键单击
web.config
文件,然后单击
addconfig transform
。这将为您生成一个模板
Web.Customer1.config
文件。使用
xdt:
config transform属性编辑它以覆盖它需要的
appSettings
。然后,您可以使用
Customer1
解决方案生成配置发布项目。作为构建的一部分,将转换
web.config
,最终为每个客户提供不同的
web.config
文件。您还可以使用它为不同的部署定制项目,例如更改数据库连接字符串、smtp服务器,以及XML配置文件中的任何内容

最后,请确保右键单击每个
Web.Xyx.config
文件,选择属性,并将其
构建操作设置为
None

例如:

基本web.config

<appSettings>
    <add key="CommonProperty1" value="[for all customers]" />
    <add key="CommonProperty2" value="[for all customers]" />
    <add key="CommonProperty3" value="[for all customers]" />
    <add key="CustomProperty1" value="[for one customer]" />
    <add key="CustomProperty2" value="[for one customer]" />
    <add key="CustomProperty3" value="[for one customer]" />
<appSettings>

web.Customer1.config

<appSettings>
    <add key="CustomProperty1" value="The Ohio State University" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="CustomProperty2" value="Scarlet" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="CustomProperty3" value="Gray" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
<appSettings>

web.Customer2.config

<appSettings>
    <add key="CustomProperty1" value="Michigan University" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="CustomProperty2" value="Blue" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
    <add key="CustomProperty3" value="Maize" xdt:Transform="SetAttributes" xdt:Locator="Match(key)" />
<appSettings>

您知道这是否也适用于MS测试项目中的
runsettings
文件吗?我在不同的集合中组织测试。一些
TestRunParameters
对于所有程序集都是通用的,而另一些则仅针对特定程序集指定。您知道这一原则是否也适用于
runsettings
?或者是否有其他机制可以使用
runsettings