多租户架构和NHibernate

时间:2008-09-18 11:49:34

标签: .net nhibernate domain-driven-design saas

最后有人能解释一下,在NHibernate支持的域模型中实现透明和流畅支持多租户功能的最佳策略是什么?

我正在寻找方法,如何使域逻辑尽可能与多租户内容保持隔离,例如TenantID等过滤

6 个答案:

答案 0 :(得分:2)

最简单的方法是为每个客户使用不同的数据库。

以这种方式实施多租户允许您有效地编写单个租户应用程序,并且只担心在创建/检索会话时的多租户。

我还没有深入研究细节(我需要在几个月内做类似的事情),但我认为管理会话所连接的数据库的最简单方法是通过自定义的ISessionFactory实现确定要使用的连接(基于外部方面,例如请求URL的主机部分)。

我在网上至少看过一篇关于此事的帖子,但我目前找不到这个链接。

如果您正在使用Castle Windsor,请查看NHibernate集成工具。这支持多个(命名)会话工厂的概念,允许您为每个客户端创建一个会话工厂。集成工具提供了一个ISessionManager接口,允许您在命名的会话工厂上打开会话(以及为Web应用程序提供每个请求的会话语义)。任何需要访问会话的内容都可以简单地使用ISession构造函数参数,您可以创建一个将ISessionManager作为构造函数参数的工厂。然后,您可以通过检查请求以确定应使用哪个命名会话工厂来在相应的命名会话工厂上打开会话。

答案 1 :(得分:2)

我已经为多租户here撰写了一种方法,但这种方法并不适用于所有情况,但是,它确实可以让您在不使用第三方产品的情况下在很大程度上忘记多租户问题

答案 2 :(得分:1)

我最近也在为我的下一个项目深入挖掘它。 您可以实现自定义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);
        }

    }

希望这有帮助。

答案 3 :(得分:1)

有多种方法可以实现它,但multi - 租赁问题比数据模型更深入。我讨厌插入产品,但是我在我工作的公司Apprenda查看SaaSGrid。我们是一个云操作系统,允许你编写单租户SOA应用程序(随意使用NHibernate进行数据访问) )自动将多租户注入您的应用程序。当您发布应用程序时,您可以执行诸如选择数据模型(隔离数据库或共享)之类的操作,SaaSGrid将相应地进行部署,您的应用程序将在没有任何代码更改的情况下运行 - 只需编写代码就像单个租户一样!

答案 4 :(得分:0)

Ayende有一些关于构建多租户应用的好文章。如何使用NHibernate将取决于您要使用的多租户类型。

答案 5 :(得分:0)

使用共享架构方法要求您使用其他信息拦截和修饰所有查询以限制结果。

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

浏览来源
相关问题