【问题标题】:NHIbernate SessionFactory and Configuration RecreationNHIbernate SessionFactory 和配置重新创建
【发布时间】:2012-11-01 10:26:25
【问题描述】:

我有一个困难的情况。

我们知道 NH SessionFactory 在我们的应用程序中是一个单例。

“重量级,线程安全,你应该只拥有一个 数据库”。

SessionFactory 是从Configuration().BuildSessionFactory() 创建的,其中Configuration() 是我流畅配置​​的数据库。

问题来了。 我需要在 MVC 应用程序中为我的连接字符串使用不同的用户。这是不同用户连接到数据库所必需的。当连接正常时,我使用 NH 来操作域映射对象。

这里的问题是 如何将不同的用户传递给Configuration并在我们需要首先创建Configuration 时使用这个SessionFactory?再次创建SessionFactory 是错误的方法,对吧?

而这变得更加困难,因为我使用 Windsor 容器在我的 MVC 应用程序运行之前注册所有对象

【问题讨论】:

  • 什么是 RDBMS?我知道 SQL Server 支持Integrated Security = SSPI,它将传递用户特定的凭据。

标签: asp.net-mvc-3 nhibernate castle-windsor sessionfactory


【解决方案1】:

听起来您想为应用程序的不同用户提供不同的连接字符串。

NHibernate 有一项功能,您可以在其中提供自己的 DriverConnectionProvider,这将使您最终能够通过覆盖 GetConnection() 方法即时创建自定义连接字符串。

例子:

class DynamicConnectionProvider : DriverConnectionProvider
{
    public override IDbConnection GetConnection()
    {
        IDbConnection connection = Driver.CreateConnection();

        try
        {
            connection.ConnectionString = // Add your logic for dynamically creating a connection string

            connection.Open();
        }
        catch ( Exception e )
        {
            connection.Dispose();

            throw;
        }

        return connection;
    }
}

您还可以查看以下链接以获取示例:

是的,创建重复的 SessionFactories 对您的应用程序内存使用来说会非常昂贵,会使您的应用程序架构复杂化,并且确实没有必要,因为还有其他选项,例如我上面列出的选项。

【讨论】:

  • +1 辉煌(我几乎可以肯定这会更困难)
  • 是的,我也在 nhforge 上找到了这个解决方案。谢谢你。某一时刻是我在我的实现中覆盖了ConnectionString 属性。这有什么缺点吗?
  • 不,没有缺点。我帮助管理了一个非常大的 Web 应用程序,它执行相同类型的操作,我们没有遇到任何问题。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-22
  • 1970-01-01
相关资源
最近更新 更多