Asp.net mvc &引用;继承;ASP.NET MVC站点是否来自通用模板应用程序?(多租户)

Asp.net mvc &引用;继承;ASP.NET MVC站点是否来自通用模板应用程序?(多租户),asp.net-mvc,architecture,inheritance,dry,multi-tenant,Asp.net Mvc,Architecture,Inheritance,Dry,Multi Tenant,我们正在构建大约10个ASP.NET MVC站点,这些站点具有一组共同的功能(以及相应的URL、路由、控制器、操作和视图)。这些站点还将共享一组基本的域对象(如用户、公司)和这些对象的基本属性(如名称、地址等) 但每个网站也将高度定制,并从基础扩展。例如,我们的大型上市公司网站将在公司域对象上有“Subsidiary”和“Stock Symbol”字段,而我们的初创公司网站将有“Venture Firm”和“Funding”属性。外观也会有很大的不同,尽管我们试图保持HTML尽可能的一致性(为额

我们正在构建大约10个ASP.NET MVC站点,这些站点具有一组共同的功能(以及相应的URL、路由、控制器、操作和视图)。这些站点还将共享一组基本的域对象(如用户、公司)和这些对象的基本属性(如名称、地址等)

但每个网站也将高度定制,并从基础扩展。例如,我们的大型上市公司网站将在公司域对象上有“Subsidiary”和“Stock Symbol”字段,而我们的初创公司网站将有“Venture Firm”和“Funding”属性。外观也会有很大的不同,尽管我们试图保持HTML尽可能的一致性(为额外的域对象属性对额外的表单字段进行模化,等等)。我们也将有节制地覆盖图像,因此我们可以,例如,跨站点重复使用相同的按钮图形

无论如何,我们正试图找出如何最好地考虑和构建事物,以便我们可以重用尽可能多的代码和测试,而不限制我们添加每个应用程序属性和改变应用程序之间的UI的自由

我很熟悉如何处理StackOverflow/SuperUser/ServerFault(或MSDN/TechNet)中的有限定制多租户,其中UI略有不同,数据模型或多或少相同。但是当模型和UI非常不同(但继承自一个公共基础)时,我不太确定如何继续

我不太担心操作问题,因为我们可能会在单独的appdomain中运行每个站点,并将它们托管在单独的数据库中。我更担心的是降低长期代码维护成本,提高灵活性(例如,在不破坏派生应用的情况下轻松向基础添加新功能),以及在构建第二、第三、第四等站点时实现短期开发/测试成本节约

我正在寻找高层次的指导和建议,同时也在寻找如何使用现代ASP.NET MVC实践使指导成为现实的具体建议

我意识到这是一个非常普遍的问题,但对于初学者来说,我正在寻找关于如何在ASP.NET MVC中应用该指导的高级指导和具体技巧,包括:

  • 建议在Visual Studio项目中拆分基础/派生的位置
  • 避免分叉的源代码管理提示
  • 数据库模式提示(FWIW,我们的数据库都很小——每个表不到10K行,因此开发/测试成本比数据库性能更重要)
  • 有关重新使用与“基本”模型属性相对应的控制器/视图等的提示,特别是对“新客户”表单等具有基本属性和派生属性的表单重新使用UI
有人对如何构建这样的多租户应用程序有好的建议吗

详细介绍了如何实现这一点:


我目前参与了一个类似类型的“套件”项目,该项目的重点是允许客户在线申请产品,但对收集哪些信息有非常相似的要求,其中唯一的区别是围绕特定于产品的信息或稍微不同的立法要求

我们尝试做的一件事是创建本身可重用的页面(模型、视图和控制器组合),这样任何应用程序都可以使用该页面捕获信息,但重定向到下一个页面,这可能会因应用的产品类型而异。为了实现这一点,我们以模板方法模式的形式使用抽象基本控制器,该模式基本上包含所有必需的控制器逻辑(包括带有应用的操作过滤器的操作方法),但随后使用抽象方法执行特定的操作,例如重定向到流程中的下一页。这意味着特定应用程序页流所使用的控制器的具体实现可能只包含一个方法,该方法返回与流中下一页对应的RedirectToActionResult。 还有很多其他的东西可以处理倒退和那些导航的事情,但是有了动作过滤器的帮助,你可以把它设置好,一旦你设置好并开始工作,你就不用担心它了

还有一些基本模型对象包含公共功能,可以是验证逻辑或状态持久性逻辑

在应用程序过程中捕获的数据作为xml序列化的模型对象保存在数据库中,一旦应用程序完成,这些对象就可以被取出并反序列化,并以任何格式输出到后端操作人员用于处理应用程序的任何系统

这意味着我们有一个项目结构,它由一个包含顶级抽象类、接口和实用程序类以及html助手、动作过滤器等的基本dll组成。然后我们有一个包含基本控制器具体实现的mvc项目,模型等以及视图和母版页

最困难的事情是分享观点,我认为我们还没有妥善解决这个问题。虽然MVC2.0包含了一些方面,我认为这将不再是一个问题,但我还没有很好地使用它。(参见Scott Gu在2.0上的帖子:) 我所做的一件事情看起来是可行的,那就是使用一个基本MVC项目来包含公共视图,然后在寻找要渲染的视图时扩展默认视图引擎来在web服务器上搜索该项目(这很容易做到)。不过,这是一个更好的解决方案

至于源代码控制,我们正在使用svn,我认为您对分支的关注是合理的。这不是我们必须处理的事情,但我们可能会使用git,因为它似乎使分支和合并的过程变得更少
  - 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