我目前正在使用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从会话工厂中获取会话并使用它来运行查询。
以这种方式进行数据库访问是否有任何陷阱?
答案 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的烦人习惯:
答案 3 :(得分:1)
我不会打开和关闭对NHibernate的每个数据请求的会话。我会使用许多其他人建议或更多阅读的工作单元库。 NHForge.org即将开始,我相信有一些实践可以为一般的Web应用程序设置NHibernate。
我从NHibernate获得的“哦,哇,这很酷的时刻”是利用在开发过程中懒洋洋地加载集合。这是一个很好的经验,能够不必为了在一些相关对象上显示数据而进行所有这些连接。
通过这样关闭会话,上述情况将无法实现。
交易也可能会发生一些事情。
答案 4 :(得分:1)
刚刚找到一个干净的解决方案,使用Unity为每个请求注入一个会话:
http://letsfollowtheyellowbrickroad.blogspot.com/2010/05/nhibernate-sessions-in-aspnet-mvc.html