【问题标题】:Use of castle windsor means ISession sometimes disposed more than once使用城堡温莎意味着 ISession 有时会被多次处理
【发布时间】: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();
}

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

  1. 从 DI 容器中检索到的存储库(注入了 IUnitOfWork
  2. 通过存储库的Load 方法加载的实体
  3. 实体已修改
  4. 通过存储库的Save 方法保存的实体
  5. 存储库和IUnitOfWork 在 Web 请求结束时由 DI 容器处理 - 更改已刷新到数据库

我的问题是我偶尔会收到“会话已关闭!对象名称:来自 NHibernate 的“ISession”错误。

据我所知,ISession 的唯一位置是在调用 IUnitOfWorkDispose() 方法时,该方法仅由 DI 容器调用。

谁能想到我收到此错误的任何其他原因?

【问题讨论】:

    标签: nhibernate dependency-injection castle-windsor


    【解决方案1】:

    当您在某处出现异常时,或者您尝试在某处的代码中自己调用 Dispose 时,可能会发生这种情况。

    Windsor 保证代码只会执行一次。

    作为旁注 - 为什么需要IUnitOfWork?它不会增加任何价值。

    【讨论】:

    • 啊,你好 Krzysztof。一如既往地感谢您的意见。我绝对不会在其他任何地方明确地处置 IUnitOfWork。我将研究异常选项。
    • 至于您的问题,曾几何时,将我的 NHibernate DAL 隐藏在一组接口后面以允许将其换出似乎是个好主意。它实际上工作得很好——如果 ISession 实例没有隐藏在接口后面,我将如何让 Windsor 注入它们?
    • 直接使用ISession。很容易 - 网络上有大量示例,包括官方 WINdsor 教程。为什么 - 我同意 @ayende 的观点 tv.devexpress.com/#DallasOrenEini
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多