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

时间:2012-07-13 14:51:43

标签: asp.net-mvc design-patterns module

我试图了解如何创建一个在解决方案中作为VS2010项目存在的ASP.NET MVC站点,然后对于多个“租户”,我将创建一个继承自该站点的站点。这样可以灵活地将模块化功能添加到一个模块而不会影响另一个,并且两者都可以从核心库优化中受益。

这是一个疯狂的想法吗?这种事情有哪些模式?我已经为基于webform的站点(将DLLS添加为插件)做了类似的事情,但在MVC中却没有。

“租户”是商业客户。每个客户端都有自己的MSSQL数据库并围绕它们进行单独处理,每个客户端都在自己的孤岛中。数据库类似,在这里和那里添加了一些功能,它们是单独版本化和部署的,整个过程运行良好。客户端有n个登录。我想开发一个单独的“基础站点”,然后可以用来为租户提供功能,并且所有活动都会被租户转移到单个数据库。事情变得丑陋的是我如何向一个租户网站添加一个新的组件(比如一个论坛),而不会破坏其他租户的网站体验。

所有想法都赞赏。感谢。

1 个答案:

答案 0 :(得分:0)

我在开发多租户Web应用程序方面做了大量工作。以下是帮助您入门的三个基本指示:

安全

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

<强>数据库

我们使用单个数据库来存储所有数据。在特定于一个租户(多租户)的表(实体)和不是(交叉租户)的表之间进行了分离。多租户的表有一个名为'TenantId'的列。在我们的实体模型中,我们确保这些实体继承自特殊的IMultiTenant接口。该接口包含TenantId字段的C#等价物。我们扩展了Entity Framework的体系结构,为TenantId提供多租户实体的默认过滤。这确保了一个租户永远无法访问或修改另一个租户的数据。

<强>插件

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