MVC中NHibernate引导的正确方法

MVC中NHibernate引导的正确方法,nhibernate,model-view-controller,structuremap,Nhibernate,Model View Controller,Structuremap,我需要在MVC中设置会话管理。正确的做法是什么? 如何使用structuremap在mvc中设置nhibernate会话管理,这样我就不会得到: 会议结束 或 在多个线程中使用单个会话可能是一个bug 我当前的配置是: 在GlobalAssax中: protected void Application_Start() { ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFac

我需要在MVC中设置会话管理。正确的做法是什么? 如何使用structuremap在mvc中设置nhibernate会话管理,这样我就不会得到:

会议结束 或 在多个线程中使用单个会话可能是一个bug

我当前的配置是: 在GlobalAssax中:

protected void Application_Start()
    {
        ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());
        Bootstrapper.ConfigureStructureMap();
        AreaRegistration.RegisterAllAreas();
        RegisterRoutes(RouteTable.Routes);

    }
在我的引导程序中,我执行以下操作:

var cfg = NHibernateManager.Configuration(assembly);
For<Configuration>().Singleton().Use(cfg);
For<ISessionFactory>().Singleton().Use(cfg.BuildSessionFactory());
For<ISession>().HttpContextScoped().Use(ctx => ctx.GetInstance<ISessionFactory>().OpenSession());
var cfg=nhibernatemager.Configuration(assembly);
For().Singleton().Use(cfg);
For().Singleton().Use(cfg.BuildSessionFactory());
For().httpContextScope().Use(ctx=>ctx.GetInstance().OpenSession());
我将ISession注入到我在应用层中使用的存储库中

编辑:如果我这样做会发生什么
For().LifecycleIs(Lifecycles.GetLifecycle(InstanceScope.PerRequest)).Use(ctx=>ctx.GetInstance().OpenSession())

您是否为会话添加了dispose

//In Global.asax.cs
protected void Application_EndRequest()
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

否则它看起来是正确的。

您是否为会话添加了dispose

//In Global.asax.cs
protected void Application_EndRequest()
{
    ObjectFactory.ReleaseAndDisposeAllHttpScopedObjects();
}

否则它看起来是正确的。

是的,现在如果我在EndRequest中添加了dispose,那么在某个查询中,我得到的会话是关闭的异常。如果我不添加上面的dispose,我会得到线程异常。@Luka-你查看过NHibernate日志并看到发生了什么吗?是的,里面没有错误。最后一行说:积极释放数据库连接,关闭连接。我的机会没有联系。对不起,我没有主意了。我想您必须跟踪/调试整个应用程序,并找出在调试时出现问题时关闭会话的原因。错误是由AutomapperYes引起的。现在,如果我在EndRequest中添加了dispose,则会在某些查询中出现“I get session Is closed”异常。如果我不添加上面的dispose,我会得到线程异常。@Luka-你查看过NHibernate日志并看到发生了什么吗?是的,里面没有错误。最后一行说:积极释放数据库连接,关闭连接。我的机会没有联系。对不起,我没有主意了。我猜您必须跟踪/调试整个应用程序,并找出在调试时出现问题时关闭会话的原因。错误是由Automapper引起的。您是在应用程序中的任何位置调用Dispose还是在会话周围使用using子句?如果是这样,请删除它,因为您让StructureMap处理生命周期。您是在应用程序中的任何位置调用Dispose还是在会话周围使用using子句?如果是这样,请删除它,因为您让StructureMap处理生命周期。