我目前正在玩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 session /工厂的最佳方法吗?我听说过有关工作单元的信息,每个Web请求都创建了一个 session 并在最后将其刷新。据我所知,我当前的实现并未执行任何操作。基本上,它是依靠存储库从 session 工厂获取 session 并使用它来运行查询。
以这种方式进行数据库访问有什么陷阱吗?
最佳答案
您不应该将ISession包裹在using语句中-将ISessionBuilder传递到存储库构造函数(依赖注入(inject))的关键是调用代码负责控制ISession的生命周期。通过将其包装在using中,在ISession上调用Dispose(),您将无法延迟加载对象成员或将其持久化。
我们通过将ISession传递到存储库构造函数来执行类似的操作。据我了解,Palermo先生的代码只是添加了ISession的惰性初始化。我认为这不是必需的,因为如果不使用存储库,为什么还要新建存储库?
关于asp.net-mvc - ASP.NET MVC中的NHibernate session 管理,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/364540/