ASP.NET MVC中的NHibernate会话管理

时间:2008-12-13 00:17:26

标签: asp.net-mvc nhibernate orm

我目前正在使用Jeffrey Palermo博客文章中的HybridSessionBuilder类:

http://jeffreypalermo.com/blog/use-this-nhibernate-wrapper-to-keep-your-repository-classes-simple/

使用这个类,我的存储库看起来像这样:

public class UserRepository : IUserRepository
{
    private readonly ISessionBuilder _sessionBuilder;

    public UserRepository(ISessionBuilder sessionBuilder)
    {
        _sessionBuilder = sessionBuilder;
    }

    public User GetByID(string userID)
    {
        using (ISession session = _sessionBuilder.GetSession())
        {
            return session.Get<User>(userID);
        }
    }
}

这是管理NHibernate会话/工厂的最佳方式吗?我听说过有关工作单元的事情,并根据网络请求创建会话并在最后将其刷新。据我所知,我当前的实现并没有做到这一点。它基本上依赖于Repository从会话工厂中获取会话并使用它来运行查询。

以这种方式进行数据库访问是否有任何陷阱?

5 个答案:

答案 0 :(得分:37)

您不应将ISession包装在using语句中 - 将ISessionBuilder传递到存储库构造函数(依赖注入)的关键是调用代码负责控制ISession的生命周期。通过将它包装在一个使用中,在ISession上调用Dispose(),你将无法延迟加载对象成员或持久化它。

我们通过将一个ISession传递给存储库构造函数来做类似的事情。根据我的理解,Palermo先生的代码只是增加了对ISession的延迟初始化。我不认为这是必要的,因为如果你不打算使用它,你为什么要新建一个存储库呢?

答案 1 :(得分:10)

使用ASP.Net MVC,您希望确保在控制器上的Action方法期间保持会话的生命周期,因为一旦您的控制器退出,您应该收集所有数据。我不确定这种机制是否有助于此。

您可能需要查看S#arp Architechure,它是一组使用nHibernate构建ASP.Net MVC应用程序的库和指南。 http://code.google.com/p/sharp-architecture/

答案 2 :(得分:3)

这是我在研究之后使用的设置。似乎工作得很好,并没有像大多数指南那样在静态文件请求上创建ISession的烦人习惯:

http://www.kevinwilliampang.com/2010/04/06/setting-up-asp-net-mvc-with-fluent-nhibernate-and-structuremap/

答案 3 :(得分:1)

我不会打开和关闭对NHibernate的每个数据请求的会话。我会使用许多其他人建议或更多阅读的工作单元库。 NHForge.org即将开始,我相信有一些实践可以为一般的Web应用程序设置NHibernate。

我从NHibernate获得的“哦,哇,这很酷的时刻”是利用在开发过程中懒洋洋地加载集合。这是一个很好的经验,能够不必为了在一些相关对象上显示数据而进行所有这些连接。

通过这样关闭会话,上述情况将无法实现。

交易也可能会发生一些事情。

答案 4 :(得分:1)

刚刚找到一个干净的解决方案,使用Unity为每个请求注入一个会话:

http://letsfollowtheyellowbrickroad.blogspot.com/2010/05/nhibernate-sessions-in-aspnet-mvc.html