当前位置:  开发笔记 > 编程语言 > 正文

ASP.NET MVC中的NHibernate会话管理

如何解决《ASP.NETMVC中的NHibernate会话管理》经验,为你挑选了2个好方法。

我目前正在使用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(userID);
        }
    }
}

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

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



1> Jamie Ide..:

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

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



2> JoshBerke..:

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

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

推荐阅读
echo7111436
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有