Использование замка Виндзор означает, что ISession иногда утилизируется более одного раза - PullRequest
0 голосов
/ 11 марта 2011

Все мои интерфейсы репозитория (т. Е. Реализованные классами для сохранения сущностей в базе данных) зависят от интерфейса, называемого 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 располагаются контейнером DI в конце веб-запроса - изменения сбрасываются в базу данных

Моя проблема в том, что я иногда получаю ' Сессия закрыта! Имя объекта: ошибка «ISession » из NHibernate.

Насколько я могу видеть, единственное место, где располагается ISession, это когда вызывается метод IUnitOfWork Dispose(), который вызывается только контейнером DI.

Кто-нибудь может подумать о другой причине, по которой я мог получить эту ошибку?

1 Ответ

0 голосов
/ 12 марта 2011

Это, вероятно, происходит, когда у вас где-то есть исключение или вы пытаетесь вызвать Dispose в коде где-то самостоятельно.

Виндзор гарантирует, что код будет выполнен только один раз.

В качестве sidenote - зачем вам IUnitOfWork?Это не добавляет никакой ценности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...