这是按照PerWebRequest处理NHibernate会话的好方法吗

这是按照PerWebRequest处理NHibernate会话的好方法吗,nhibernate,session,castle-windsor,Nhibernate,Session,Castle Windsor,我一直在努力研究NHibernate会话管理,现在有两种可能的解决方案来满足每个web请求的会话 我正在ASPNET mvc项目中使用Windsor for IoC 第一种解决方案是在begin_请求中打开一个会话,并在end_请求中再次关闭/处置它。在温莎设置中,我会 container.Register(Component.For().UsingFactoryMethod(()=>SessionFactory.GetCurrentSession()).lifety.Transient 此解决

我一直在努力研究NHibernate会话管理,现在有两种可能的解决方案来满足每个web请求的会话

我正在ASPNET mvc项目中使用Windsor for IoC

第一种解决方案是在begin_请求中打开一个会话,并在end_请求中再次关闭/处置它。在温莎设置中,我会 container.Register(Component.For().UsingFactoryMethod(()=>SessionFactory.GetCurrentSession()).lifety.Transient

此解决方案根据请求创建会话,并通过GetCurrentSession共享会话

第二个解决方案是使用类似温莎的

container.Register(Component.For().UsingFactoryMethod(()=>SessionFactory.OpenSession()).lifety.PerWebRequest)

这还应该为每个web请求和支持构造函数注入提供一个会话。这有点简单,但我需要第二个意见

请告诉我您喜欢用什么

致意
Rasmus

我使用工作单元,我根据容器中的web请求配置工作单元。工作单元不仅创建会话,还提交和回滚事务。使用工作单元的主要原因是使数据库更稳定。有关工作单元模式的更多信息,请参阅


我不推荐这两种解决方案中的任何一种。与其尝试重新发明轮子,不如使用。

在web应用程序中重新发明什么样的轮子?@Paco:NHibernate会话管理与Windsor在web应用程序中使用您自己的方式包装任何类型的IUoW模式,并根据这种方式编程将节省大量重构时间您决定更改持久性技术。编写包装器可能需要10分钟,在开发过程中没有额外的时间,并且抽象出您无法控制的接口。这听起来可能有点偏执,但一旦您遇到更改持久性提供程序的麻烦,您就不会再想它了。
public interface INHiberanteUnitOfWork
{
    ISession session { get; }
    void Commit();
    void RollBack();
}