2010-01-24 111 views
3

我有NHibernate挂在我的asp.net mvc应用程序。如何在ASP.NET MVC应用程序中部署NHibernate ISession

一切工作正常,如果我不处置ISession。不过,我已经读过,你应该处置,但是当我这样做时,我会随机获得“Session is closed”异常。

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

这是我目前的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); 

当我钉的Dispose在模块中取消绑定错误发生。由于我不断收到会话是关闭错误,我认为这不是正确的方式来做到这一点,那么正确的方法是什么?

谢谢, 乔

回答

1

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

0

似乎有些对象持有的会议得到处理,温莎试图处置会话之前。一个快速解决方法是将你的NHiberanteSessionFactory Dispose方法包装起来,并检查会话是否已经关闭。