1

我们正在开发一个时下流行的多租户 SaaS 应用程序(共享数据库、共享模式),我不喜欢它的一件事:

public class Domain : BusinessObject
{
    public virtual long TenantID
    { get; set; }

    public virtual string Name
    { get; set; }
}

TenantID让我发疯了,因为它几乎无处不在,而且从安全的角度来看这是一个麻烦:如果恶意 API 用户更改TenantID为其他值并将混淆事情会发生什么。

我想要做的是在我们的域对象中完全摆脱它TenantID,并让 NHibernate 或 SQL Server 处理它。

根据我已经在 Internet 上阅读的内容,这可以通过CONTEXT_INFO(这里是基于NHibernate 的实现)、NHibernate 过滤器SQL 视图以及它们的组合来完成。

现在,我的要求如下:

  • TenantID从域对象中删除任何提及
  • ...但是让 SQL Server 在适当的地方插入它(我想这是通过default约束实现的)
  • ...并且显然提供基于此标准的过滤支持,以便客户永远不会看到彼此的数据
  • 如果可能,请避免使用 SQL Server 视图。
  • 拥有一个与 NHibernate、SQL Server 的 MARS 以及 SaaS 应用程序的一般性质高度并发的完美配合的解决方案

你对此有何看法?

4

2 回答 2

2

我发现这份文档几乎是 MultiTenant 的圣杯。 http://msdn.microsoft.com/en-us/library/aa479086.aspx

看看使用“共享数据库共享架构”等方法之一,然后为每个租户使用不同的 sql 用户连接到数据库。每个 sql 用户都会看到一个过滤后的数据子集,并且只能检索自己的数据,并且在插入数据时,会自动为其分配自己的tenantID。

您会发现不再需要在应用程序中考虑 TenantID,只需对其余表进行建模即可。

于 2011-02-07T22:48:24.843 回答
1

Jason Young的博客文章中展示了我用于 SaaS 应用程序的共享数据库和共享模式的方法。

这与您在问题中提供的 Jason Dentler的帖子有关,并将视图而不是表映射到您的域构成了一个非常孤立的解决方案。您可以从我非常喜欢的模型中完全摆脱 TenantID。

在我的应用程序中,我将它与 EntityFramework 一起使用,但不幸的是,EF 没有这样的好东西DriverConnectionProvider,这真是太可惜了。

于 2011-01-01T12:10:49.457 回答