我的所有存储库接口(即由用于将实体持久保存到数据库的类实现)都依赖于名为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();
}
因此,保存实体遵循以下步骤:
IUnitOfWork
)Load
方法Save
方法IUnitOfWork
- 刷新到数据库的更改我的问题是我偶尔会收到&#39; 会话已关闭!对象名称:&#39; ISession &#39;来自NHibernate的错误。
据我所知,ISession
处置的唯一位置是调用IUnitOfWork
的{{1}}方法时,只调用DI容器
任何人都可以想到我可能会收到此错误的其他原因吗?
答案 0 :(得分:0)
当你在某个地方遇到异常时,或者你正试图在代码中某处调用Dispose
时,可能会发生这种情况。
Windsor保证代码只执行一次。
作为旁注 - 你为什么需要IUnitOfWork
?它没有增加任何价值。