3

我在我的 asp.net mvc 应用程序中连接了 NHibernate。

一切正常,如果我不处置 ISession。但是,我已经读过您应该处理,但是当我这样做时,我会随机出现“会话已关闭”异常。

我正在使用 Windsor 将 ISession 注入到我的其他对象中。

这是我目前的NHModule:

public class NHibernateHttpModule : IHttpModule
{
    public void Init(HttpApplication context)
    {
        context.BeginRequest += context_BeginRequest;
        context.EndRequest += context_EndRequest;
    }

    static void context_EndRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Unbind(MvcApplication.SessionFactory);
    }

    static void context_BeginRequest(object sender, EventArgs e)
    {
        CurrentSessionContext.Bind(MvcApplication.SessionFactory.OpenSession());
    }

    public void Dispose()
    {
        // do nothing
    }
}

注册 ISession:

container
  .Register(Component.For<ISession>()
     .UsingFactoryMethod(() =>  MvcApplication.SessionFactory.GetCurrentSession()).LifeStyle.Transient);

当我在模块中的 unbind 上添加 Dispose 时会发生错误。由于我不断收到会话已关闭错误,我认为这不是正确的方法,那么正确的方法是什么?

谢谢,乔

4

3 回答 3

1

罗伯特是正确的,温莎在释放依赖它的组件时正在处理会话。我建议不要使用自己的 HttpModule,而是为 ISession 使用 Windsor 的 PerWebRequest 生活方式。

于 2010-07-28T10:55:46.360 回答
0

在 Windsor 尝试处置会话之前,似乎某些持有会话的对象已被处置。一个快速的解决方法是覆盖您的 NHiberanteSessionFactory Dispose 方法并检查会话是否已经关闭。

于 2010-01-25T13:08:01.930 回答
0

我认为这篇文章应该会有所帮助:使用 NHibernate 构建桌面待办事项应用程序

现在我知道,这是一个桌面应用程序,但您可能会从这篇 MSDN 文章中得到启发。

于 2010-01-29T14:34:19.237 回答