为客户端特定功能构建多实例 MVC 应用程序

Structuring multi-instance MVC app for client specific features

我有一个 MVC 解决方案 projects/layers:

我在多实例设置中为多个客户托管此应用程序,并为客户提供定制应用程序以满足他们的特定需求。大多数时候,这涉及添加可能适合其他客户的功能,我 enable/disable 它在 web.config.

中带有 key/value

虽然最近,一些客户要求提供其他客户永远不需要的非常具体的功能。我正在尝试弄清楚如何在我的应用程序中构建它,以便尽可能地将它与标准应用程序完全分开。

在理想情况下,我会在该客户的解决方案中有一个单独的项目,并且所有内容都在其中,但所涉及的功能将触及应用程序的每一层:视图、控制器,Css 、图像、新领域模型、NHibernate 映射和新服务。

我不一定要在这里寻找灵丹妙药,但我似乎无法在网上找到任何关于这种设置的内容,但这肯定是以前解决过的问题吗?

如果有人能指出任何与此相关的文章的方向,我将不胜感激。

满足这些需求的一个干净的解决方案是插件架构。

此类解决方案的范围从中等复杂到非常复杂,具体取决于所需的灵活性以及您是否需要能够在运行时更换插件。

与你选择的路径无关,你需要在你想提供自定义行为的地方引入接口。如果您一开始就没有针对此类情况设计应用程序,那么仅此一项就已经具有挑战性。

那么,你有几个策略:

显式插件配置

使用这种方法,您可以在应用程序启动期间加载某种 "customer configuration" 并使用它来注册所需的插件。

如果你有一个明确的、干净的 composition root 并使用一个强大的依赖注入容器(我个人可以推荐 Autofac,但有很多选择。

插件的自动检测和实例化

使用这种方法,您的应用程序会自动找到插件(例如,通过查找特定文件夹中的程序集)并加载它们。这个比较复杂,因为需要手动加载程序集和实例化类。如果你走这条路,MEF 可能值得一看。