我目前正在使用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从会话工厂中获取会话并使用它来运行查询.
以这种方式进行数据库访问是否有任何陷阱?
您不应该将您的ISession包装在using语句中 - 将ISessionBuilder传递到存储库构造函数(依赖注入)的关键是调用代码负责控制ISession的生命周期.通过将其包装在一个使用中,在ISession上调用Dispose(),您将无法延迟加载对象成员或持久化它.
我们通过将一个ISession传递给存储库构造函数来做类似的事情.根据我的理解,Palermo先生的代码只是增加了对ISession的延迟初始化.我不认为这是必要的,因为如果你不打算使用它,你为什么要新建一个存储库呢?
使用ASP.Net MVC,您希望确保在控制器上的Action方法期间保持会话的生命周期,因为一旦您的控制器退出,您应该收集所有数据.我不确定这种机制是否会对此有所帮助.
您可能需要查看S#arp Architechure,它是一组使用nHibernate构建ASP.Net MVC应用程序的库和指南.http://code.google.com/p/sharp-architecture/