2

在创建 ASP.Net MVC 应用程序时,我有一个问题让我印象深刻:假设您有一个应用程序要部署给多个客户。应用程序代码是相同的,但是您希望能够为每个客户拥有一个 appSettings.config 文件,这样您就可以通过更改 web.config 中 appSettings 标签的 configSource 来部署到不同的客户(有点简化,但仍然)。

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

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

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

有谁以前解决过类似的问题吗?我一直认为这似乎是一个常见的场景..

4

1 回答 1

5

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

要创建不同的转换,首先要创建不同的项目平台。转到 Visual Studio 配置管理器,在Configuration您的 Web 项目(或任何需要自定义配置设置的项目)的列中,单击下拉菜单,然后单击<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 ActionNone.

例子:

基础 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>
于 2012-11-20T15:36:18.643 回答