使用城堡windsor意味着ISession有时不止一次

时间:2011-03-11 14:12:27

标签: nhibernate dependency-injection castle-windsor

我的所有存储库接口(即由用于将实体持久保存到数据库的类实现)都依赖于名为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();
}

因此,保存实体遵循以下步骤:

  1. 从DI容器中检索到的存储库(注入了IUnitOfWork
  2. 通过存储库Load方法
  3. 加载的实体
  4. 已修改实体
  5. 通过存储库Save方法
  6. 保存的实体
  7. 在Web请求结束时由DI容器处理的存储库和IUnitOfWork - 刷新到数据库的更改
  8. 我的问题是我偶尔会收到&#39; 会话已关闭!对象名称:&#39; ISession &#39;来自NHibernate的错误。

    据我所知,ISession处置的唯一位置是调用IUnitOfWork的{​​{1}}方法时,只调用DI容器

    任何人都可以想到我可能会收到此错误的其他原因吗?

1 个答案:

答案 0 :(得分:0)

当你在某个地方遇到异常时,或者你正试图在代码中某处调用Dispose时,可能会发生这种情况。

Windsor保证代码只执行一次。

作为旁注 - 你为什么需要IUnitOfWork?它没有增加任何价值。