【问题标题】:NHibernate session lifetime managementNHibernate 会话生命周期管理
【发布时间】:2016-04-12 14:55:06
【问题描述】:

我想,对于在 ASP.NET 应用程序中遇到 NHibernate 的每个人来说,这是一个常见的问题,但即使经过两个小时的谷歌搜索,我仍然无法弄清楚如何正确管理 ISession 生命周期。 我知道它应该是每个请求一个 ISession 实例,但问题是我的 ISessionFactory 被深入注入基础设施层存储库的调用堆栈中,由域类调用,然后由控制器调用。我希望我的域服务保持单例,以防止他们重新创建每个请求,但我不能将依赖于请求的服务注入单例服务。另一方面,我不能在存储库中手动打开和关闭会话,因为这样我就失去了“懒惰”。 那么问题来了,如何在 IOC-container 中注册 ISession,以便在每个请求中获取新的,但要从单例存储库中使用它?

【问题讨论】:

    标签: c# asp.net nhibernate


    【解决方案1】:

    您可以在启动请求时创建会话,并绑定到请求上下文(这将是您的请求 - 确保配置当前会话上下文),

    session = sessionFactory.OpenSession();
    NHibernate.Context.CurrentSessionContext.Bind(session);
    

    然后在存储库中,您可以使用 sesssionFactory 获取当前会话

    session = this.sessionFactory.GetCurrentSession();
    

    【讨论】: