【发布时间】:2011-03-11 14:12:26
【问题描述】:
我所有的存储库接口(即由用于将实体持久保存到数据库的类实现)都依赖于一个名为 IUnitOfWork 的接口。存储库类和 IUnitOfWork 由 Castle Windsor 处理,其生活方式为 PerWebRequest。
Repository<T> 实现(由所有存储库扩展)如下所示:
public abstract class Repository<T> where T : Entity
{
protected IUnitOfWork _unitOfWork;
internal Repository(IUnitOfWork unitOfWork)
{
_unitOfWork = unitOfWork;
}
public T Load(int id)
{
T t;
t = _unitOfWork.Load<T>(id);
return t;
}
public virtual void Save(T t)
{
_unitOfWork.Save(t);
}
public virtual void Delete(T t)
{
_unitOfWork.Delete(t);
}
public IQueryable<T> All
{
get { return _unitOfWork.GetList<T>(); }
}
}
实现IUnitOfWork的类使用NHibernate(它包含一个ISession)并有一个Dispose这样的方法:
public void Dispose()
{
_session.Flush();
_session.Dispose();
}
因此,实体的保存遵循以下步骤:
- 从 DI 容器中检索到的存储库(注入了
IUnitOfWork) - 通过存储库的
Load方法加载的实体 - 实体已修改
- 通过存储库的
Save方法保存的实体 - 存储库和
IUnitOfWork在 Web 请求结束时由 DI 容器处理 - 更改已刷新到数据库
我的问题是我偶尔会收到“会话已关闭!对象名称:来自 NHibernate 的“ISession”错误。
据我所知,ISession 的唯一位置是在调用 IUnitOfWork 的 Dispose() 方法时,该方法仅由 DI 容器调用。
谁能想到我收到此错误的任何其他原因?
【问题讨论】:
标签: nhibernate dependency-injection castle-windsor