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

时间:2012-11-20 14:02:07

标签: asp.net-mvc configuration asp.net-mvc-4 appsettings

在创建ASP.Net MVC应用程序时,我有一个问题让我感到震惊:假设您有一个应用程序要部署到多个客户。应用程序代码是相同的,但您希望每个客户都能拥有一个appSettings.config文件,这样您只需更改web.config中appSettings标记的configSource即可部署到不同的客户(稍微简化一下) ,但仍然)。

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

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

我还没有找到一种直接的解决方法,使用ASP.Net MVC4中的开箱即用功能。它是退出的,还是我需要以某种方式绕过默认的ConfigurationManager类?我可以创建自己的类,并通过调用我自己的实现来替换对ConfigurationManager.AppSettings [key]的所有调用,但如果可以的话,我宁愿避免这样做。我希望能够利用内置ConfigurationManager负责的一些基本功能,如缓存等。

以前解决过类似问题的人?我一直认为这似乎是一种常见的情况..

1 个答案:

答案 0 :(得分:5)

这是一种常见的情况,有不同的解决方法。一种方法是使用config transforms。您可以拥有Web.Customer1.configWeb.Customer2.config等,就像拥有Web.Debug.configWeb.Release.config一样。在客户特定的转换文件中,您只能“覆盖”客户想要自定义的appSettings

要创建不同的转换,首先要创建不同的项目平台。转到Visual Studio配置管理器,并在Web项目的Configuration列(或任何需要自定义配置设置的项目)中,单击下拉列表,然后单击<New...>。将新项目配置命名为Customer1或您想要的任何内容,选中Copy settings from框,然后从该下拉列表中选择Release。同时选中Create new solution configurations复选框。

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

最后一点,请确保右键单击每个Web.Xyx.config文件,选择属性,然后将其Build Action设置为None

示例:

base 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>