但是,每个网站也将被高度定制并从基地扩展.例如,我们的大型上市公司网站将在公司域名对象上拥有“子公司”和“股票代码”字段,而我们的创业公司网站将拥有“创业公司”和“资金”属性.虽然我们试图保持HTML的一致性(额外的域对象属性的模数额外的字段等),但是看起来也会有很大差异.我们也会谨慎地覆盖图像,所以我们可以通过网站重新使用相同的按钮图形.
无论如何,我们正在努力确定如何最好地对因素进行设计和构建,以便我们可以重用尽可能多的代码和尽可能多的测试,而不会限制我们自由添加每个应用程序的属性,并改变应用之间的UI.
我熟悉如何处理有限定制多租户,就像您在StackOverflow / SuperUser / ServerFault(或MSDN / TechNet中)中发现的那样),其中UI与此有所不同,数据模型更多或更少相同.但是当模型和UI非常不同(但是从一个共同的基础继承)时,我不太确定如何继续.
我不太担心操作问题,因为我们可能会在单独的应用程序中运行每个站点,并将它们托管在单独的数据库中.我更担心减少长期的代码维护成本,提高敏捷性(例如,轻松添加新功能到基础,而不会导致衍生应用程序),并实现短期的开发/测试成本节省,因为我们建立了第二,第3,第4等站点.
我正在寻找高层次的指导和建议,也是如何使用现代ASP.NET MVC实践使该指导真正的具体建议.
我意识到这是一个非常普遍的问题,但是对于初学者,我正在寻找高级指导以及如何在ASP.NET MVC中应用该指导的具体技巧 – 具体技巧,包括以下内容:
>建议在Visual Studio项目中分割基础/派生
>源头控制提示,避免分叉
>数据库模式提示(FWIW,我们的数据库都很小 – 每个表的10K行以下,所以dev /测试成本比DB perf更多的问题)
>关于重新使用Controllers / Views / etc的提示.对应于“基本”模型属性,特别是重新使用UI,如“新客户”形式,将具有基础和派生属性的混合.
任何人如何构建这样的多租户应用程序有好的建议?
解决方法
>为您的控制器,viewmodels,HttpApplication,路由等定义一个核心的MVC项目.这将编译成一个DLL,并危及大部分的站点.
>为您的网站创建一组基本的默认视图,脚本,图像等.这些服务器将作为您的各个站点的默认值.
>每个客户端,创建任何自定义控制器,路由等,您需要在一个项目中编译到另一个dll.
>同时每个客户端,重新创建任何您想要使用的视图,图像.
要使上述步骤一起工作,您需要写一点胶水.第一块胶水是定制视图引擎.您将需要自定义标准视图引擎,以首先查找客户端特定文件夹中的视图,然后再查找默认文件夹.这允许您轻松覆盖每个客户端的默认布局.
获取一切工作的第二种方法是让您的核心应用程序从您的客户端特定程序集加载路由,控制器等.为此,我使用Managed Extensibility Framework(MEF)来公开一个Register方法.在我的客户端汇编代码上调用此方法可以注册路由和其他特定客户端的需求.
以下是我的网站文件夹结构的一般视图,首先检查SiteContent的视图:
- AppContent - AppContent/Static - AppContent/Static/Images - AppContent/Static/Scripts - AppContent/Static/Styles - AppContent/Views - AppContent/Views/Shared - SiteContent - SiteContent/Static - SiteContent/Static/Images - SiteContent/Static/Scripts - SiteContent/Static/Styles - SiteContent/Views - SiteContent/Views/Shared - web.config - Global.asax
我有帮助,我可以像SiteImage和AppImage一样用于我的视图.此外,我使每个客户端站点都使用某些特定的名称作为其母版页,我从未在我的AppContent默认值中定义.
我意识到这是一个粗略的概述,但它现在正在为我们工作.