在创建ASP.Net MVC应用程序时,我有一个问题让我感到震惊:假设您有一个应用程序要部署到多个客户。应用程序代码是相同的,但您希望每个客户都能拥有一个appSettings.config文件,这样您只需更改web.config中appSettings标记的configSource即可部署到不同的客户(稍微简化一下) ,但仍然)。
然后您意识到appSettings.config中50%的内容对所有客户都是通用的,只有50%是依赖客户的。您最终可能会在所有appSettings文件中包含重复的条目,这是一个主要的缺陷,因为如果您想对应用程序进行应用程序范围的更改,则需要记住更新所有这些条目。
在这种情况下,我真的希望有一种分层系统,你可以在单独的文件中拥有“基本配置”和“客户配置”。然后我希望ConfigurationManager首先检查客户配置中的值,如果没有在那里定义,它将转到基本配置。
我还没有找到一种直接的解决方法,使用ASP.Net MVC4中的开箱即用功能。它是退出的,还是我需要以某种方式绕过默认的ConfigurationManager类?我可以创建自己的类,并通过调用我自己的实现来替换对ConfigurationManager.AppSettings [key]的所有调用,但如果可以的话,我宁愿避免这样做。我希望能够利用内置ConfigurationManager负责的一些基本功能,如缓存等。
以前解决过类似问题的人?我一直认为这似乎是一种常见的情况..
答案 0 :(得分:5)
这是一种常见的情况,有不同的解决方法。一种方法是使用config transforms。您可以拥有Web.Customer1.config
,Web.Customer2.config
等,就像拥有Web.Debug.config
和Web.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>