我正在开发一个大型 ASP.NET MVC 站点,这是一项向客户出售的商务服务。我们主要向小型和大型机构销售,因此它不是收缩包装规模的。这些大客户会要求我们进行定制,大多比但包括定制布局以适应他们的网站。

我们目前的想法是,即使 MVC 使用仅调用其他代码的非常简单的 Controller (如推荐的那样)遵循其自然结论, View 也将是一个难题,因为它们不适合这种可组合性,在无论如何,我们一直在使用 Razor。很难对它们进行子类化并说“为这个客户做一些额外的事情”;特别是,很难为相同的构造提供略有不同的 HTML。

我们无法弄清楚如何让 Multi-Tenancy 和单租户工作干净,我们不希望 fork 代码库,即使对一个或多个客户的定制是彻底的。 (在可能的范围内,我们希望在所有客户之间保持数据库结构同构,我想这是我们为 Multi-Tenancy 做的方式,但由于规模和规模的原因,每个租户都必须是他们自己的 IIS 网站。隔离。)即使我们想出了一种覆盖一层自定义 View 的方法,这也将允许 View 中出现轻微的逻辑不匹配。

这样做的最新技术是什么?有哪些 war 故事? (这可能是主观的,但它主要是客观的,因为如果有一种模式或方法可以完全将其分解为本质,那当然是正确的答案。我认为这是一个有趣的问题。)

我很乐意提供更多细节。

最佳答案

我们最近开发了一个网站来支持我们的 5 个 Regents 机构。由于我们有固定的客户群,而且不太可能增长,因此我们做出了一些您可能不会做出的选择。例如,我们每个客户都有一个单独的数据库实例。显然,这不能很好地扩展,但它确实显着简化了模型,因此对我们来说它是有效的。

我使用的策略是:

  • 关注功能和配置,而不是客户。我们为每个机构提供了一套核心功能。其中只有少数功能是可定制的。对于每个机构,我们维护一个 Web.Config 转换,其中包含他们对可定制功能的选择。发布设置用于控制在发布该机构的应用程序时使用哪种转换。 View / Controller 使用配置数据来实现为该机构指定的特征的变体。它不知道它是哪个机构,只是配置说“在呈现小部件 C 时执行 A,而不是 B”。
  • 将主题分为公共(public)组件和站点特定组件。大多数 CSS/图像对所有机构都是通用的,但是,我们最后加载站点特定的 CSS,允许覆盖特定站点。这主要是颜色、背景和机构特定的图像(横幅等)。我们将特定于站点的主题放在 content/themes 中的单独文件夹中。配置项用于设置主题文件夹,主 View 在为 CSS 和任何特定于站点的图像构建 url 时提取此配置项(大部分,如果不是全部,在站点 CSS 文件本身中处理)。
  • 维护一个包装标准配置的强类型配置类。将此类注入(inject) Controller 、邮件程序等需要配置的地方。因为我们依赖于整个应用程序的配置,所以我们认为将其提升为我们模型中的一流实体对于可读性和可维护性很重要。对于非二进制选项,我们通常创建映射到设置的 enums 以避免字符串比较。对于更复杂的应用程序或更多机构,我什至可能会开发一个单独的配置部分处理程序并将配置分离到它自己的部分或配置文件中。目前我们使用的是appsettings,因为设置的数量很少,而且比较简单。

  • 希望这可以帮助。

    关于asp.net-mvc - 设计一个 ASP.NET MVC 3 站点以支持客户特定的 View 自定义而无需 fork ,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8863334/

    10-11 20:34
    查看更多