谁能最终解释一下在 NHibernate 支持的域模型中实现对多租户功能的透明和流畅支持的最佳策略是什么?
我正在寻找方法,如何使域逻辑尽可能地与多租户的东西隔离,比如通过 TenantID 过滤等
谁能最终解释一下在 NHibernate 支持的域模型中实现对多租户功能的透明和流畅支持的最佳策略是什么?
我正在寻找方法,如何使域逻辑尽可能地与多租户的东西隔离,比如通过 TenantID 过滤等
最简单的方法是为每个客户端使用不同的数据库。
以这种方式实现多租户可以让您有效地编写单租户应用程序,而只需担心创建/检索会话时的多租户。
我还没有深入研究细节(我需要在几个月内做类似的事情),但我认为管理会话连接到哪个数据库的最简单方法是通过可以确定哪个连接的自定义 ISessionFactory 实现使用(基于外部方面,例如请求 url 的主机部分)。
我至少在网上看到过一篇讨论这个问题的帖子,但目前我找不到链接。
如果您使用的是 Castle Windsor,请查看 NHibernate 集成工具。这支持多个(命名的)会话工厂的概念,这将允许您为每个客户端拥有一个会话工厂。集成工具提供了一个 ISessionManager 接口,它允许您在命名会话工厂上打开会话(以及为 Web 应用程序提供每个请求的会话语义)。任何需要访问会话的东西都可以简单地采用 ISession 构造函数参数,您可以创建一个将 ISessionManager 作为构造函数参数的工厂。然后,您的工厂可以通过检查请求以确定应该使用哪个命名会话工厂来在适当的命名会话工厂上打开一个会话。
我最近也一直在为我的下一个项目深入研究它。您可以实现自定义 IConnectionProvider 并使用“connection.provider”将其注册到配置中。
我建议您从 DriverConnectionProvider 派生并覆盖 ConnectionString 而不是实现完全自定义的。
它可以是这样的:
public class ContextualConnectionProvider : DriverConnectionProvider
{
protected override string ConnectionString
{
get
{
return GetCurrentTenantDatabaseConnectionStringInternally();
}
}
public override void Configure(IDictionary<string, string> settings)
{
ConfigureDriver(settings);
}
}
希望这可以帮助。
我在这里写了一个多租户方法,该方法并不适用于所有情况,但是,它确实可以让您在很大程度上忘记多租户问题,而无需使用 3rd 方产品。
There are a variety of ways to accomplish it, but the issues of multi-tenancy go deeper than just the data model. I hate to be plugging product, but check out SaaSGrid by my the company I work at, Apprenda.We're a cloud operating system that allows you to write single tenant SOA apps (feel free to use NHibernate for data access) that automatically injects multi-tenancy into your app. When you publish your app, you can do things like choose a data model (isolated database or shared) and SaaSGrid will deploy accordingly and your app will run without any code changes - just write code as if it were for a single tenant!
Ayende有一些关于构建多租户应用程序的优秀博客文章。如何使用 NHibernate 取决于您要使用的多租户类型。
使用共享模式方法需要您拦截并使用附加信息修饰所有查询以限制结果。
NHibernate 提供了拦截器来做到这一点,事件监听器也可以从 NHibernate 2.0 Aplpha 1 中获得。
请参阅http://elegantcode.com/2008/05/15/implementing-nhibernate-interceptors/和http://www.codinginstinct.com/2008/04/nhibernate-20-events-and-listeners.html讨论这些。
还可以看看 Ayende 的 Rhino Security 组件,因为他在这方面做了很多工作来修改基于安全描述符的附加限制的查询。您可以在https://rhino-tools.svn.sourceforge.net/svnroot/rhino-tools/trunk/security浏览源代码