4

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

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

A "tenant" is a business client. Each already has their own MSSQL database and seperate processing around them, each client is in its own silo. The databases are similar with a few features added here and there, they are versioned and deployed seperately, that whole process works well. A client has n logons. I want to develop a single "base site" that can then be used to give function to a tenant, and all activities are segerated for a tenant to a single database. Where things get ugly is how I can add a new component (say a forum) to one tenant site without mucking up the site experience for other tenants.

All ideas appreciated. Thanks.

4

1 回答 1

0

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

安全

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

数据库

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

插件

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

于 2012-08-07T17:00:18.863 回答