ASP.NET MVC 多租户和插件模式?

4

我希望理解如何创建一个ASP.NET MVC网站,作为VS2010解决方案中的一个项目,然后为多个“租户”创建一个从该网站继承的网站。这将使添加模块化功能变得更灵活,而不会影响其他网站,并且都可以从核心库优化中受益。

这是一个疯狂的想法吗?有什么模式可用于这种情况?我已经为基于WebForm的网站做过类似的事情(将DLL作为插件添加),但在MVC中没有。

“租户”是商业客户,每个客户已经拥有自己的MSSQL数据库和分离处理,每个客户都处于自己的隔离区。这些数据库相似,有一些功能添加到此处和那里,它们被版本化并分别部署,整个过程运作良好。每个客户有n个登录。我想开发一个单一的“基本站点”,然后用它来给租户提供功能,并将所有活动隔离到一个租户的单个数据库中。问题在于如何向一个租户站点添加新组件(例如论坛),而不会破坏其他租户的站点体验。

欢迎提出所有的想法。谢谢。


1
解释一下你想通过租户项目实现什么目标,可能会在引导你(和我们)找到一个好答案方面有很大帮助。你如何设想插件与站点的MVC结构进行交互? - Tetsujin no Oni
这就是DotNetNuke(一个基于插件和模块化的CMS)从未决定迁移到ASP.NET MVC的原因之一。对于正确的工作,只需要正确的工具:http://www.dotnetnuke.com/Resources/Blogs/EntryId/2464/ASP-NET-MVC-and-DotNetNuke.aspx - Darin Dimitrov
达林,我觉得这就是我犹豫的地方,因为DNN在部署上占用了大量的空间,而且我所需的75%功能只是使用存储过程进行CRUD操作,并不是DNN或其他任何内容管理系统擅长的。 - Snowy
1个回答

0

我在多租户Web应用程序的开发方面进行了广泛的工作。以下是三个基本指针,可帮助您入门:

安全性

TenantId是登录凭据的一部分。这些存储在Thread.CurrentPrincipal中。这有效地将每个请求(线程)绑定到特定的用户和租户。可以轻松从任何代码访问Thread.CurrentPrincipal。

数据库

我们使用单个数据库存储所有数据。对于专为一个租户(多租户)而设计的表(实体)和不是(跨租户)的表进行了分离。多租户的表具有名为“TenantId”的列。在我们的实体模型中,我们确保这些实体继承自特殊的IMultiTenant接口。此接口包含TenantId字段的C#等效项。我们扩展了Entity Framework的架构,以提供对多租户实体的TenantId的默认过滤。这确保了一个租户永远无法访问或修改另一个租户的数据。

插件

我们使用了一些依赖注入技巧,以支持特定于租户的代码实现。根据当前的TenantId,我们的DI容器注入该接口的特定于租户的实现。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接