请问有没有人能最终解释一下,在NHibernate支持的域模型中实现透明流畅的多租户功能的最佳策略是什么?
我正在寻找一种方法,如何尽可能地将域逻辑与多租户相关内容(如按TenantID过滤)隔离开来。
请问有没有人能最终解释一下,在NHibernate支持的域模型中实现透明流畅的多租户功能的最佳策略是什么?
我正在寻找一种方法,如何尽可能地将域逻辑与多租户相关内容(如按TenantID过滤)隔离开来。
最近我也一直在研究它,为我的下一个项目做准备。
你可以实现自定义的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);
}
}
使用共享模式需要你拦截并装饰所有查询,以附加信息来限制结果。
NHibernate提供了拦截器来实现这一点,自NHibernate 2.0 Alpha 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中浏览源代码。
Ayende有一些关于构建多租户应用程序的好博客文章。如何使用NHibernate取决于您选择的多租户类型。