如何在多数据库同模式环境下高效使用NHibernate ISessionFactory?

How to efficiently use NHibernate ISessionFactory in a multi-database same schema environment?

我们正在开发一个 MVC 应用程序,并且有一个环境,在这个环境中,所有客户端都有自己的数据库副本,并且都具有相同的架构。在某些情况下,用户可能需要在一个请求中访问多个客户端数据库。每次应用程序需要打开新的客户端数据库时,我都试图避免创建 ISessionFactory 的实例。所有其他设置都相同,所以我真的只是想要一种方法来在创建 ISessionFactory 后更改它的连接字符串。从我的研究来看,这似乎是不可能的。

大多数人认为此 article 是首选解决方案,基本上是缓存配置,因此每次调用使用不同连接字符串创建会话工厂时都不需要重新评估。这个 post 已经有几年历史了,所以我想知道是否还有其他人想出更有效的方法来更改连接字符串或处理这种类型的多租户环境?

在我的例子中,我从 DriverConnectionProvider 派生,覆盖 GetConnection 方法为当前租户使用正确的连接字符串。选择连接字符串的逻辑封装在一个Provider对象中:

public class HibernateConnectionProvider : NHibernate.Connection.DriverConnectionProvider
{
    public static IProvider<string> ConnectionStringProvider { private get; set; }

    protected override string ConnectionString
    {
        get { return ConnectionStringProvider.ProvideValue(); }
    }
}

我认为在 MVC 应用程序中委派数据库访问管理是错误的!

这应该委托给 DevOps。为此,您将需要每个客户的 MVC 应用程序,然后您无需担心支持数据库选择的代码,尽管它是以额外应用程序为代价的。不过觉得这两者都是小恶。

在目前的工作中,我们有这种架构(大约在您分享的 post 时间设计),它确实导致了很多问题。例如,一位客户需要功能 A,这需要数据库迁移 B,这意味着停止所有客户的服务,并且经常出现未处理的情况。