Все мои интерфейсы репозитория (т. Е. Реализованные классами для сохранения сущностей в базе данных) зависят от интерфейса, называемого 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
располагаются контейнером DI в конце веб-запроса - изменения сбрасываются в базу данных
Моя проблема в том, что я иногда получаю ' Сессия закрыта! Имя объекта: ошибка «ISession » из NHibernate.
Насколько я могу видеть, единственное место, где располагается ISession
, это когда вызывается метод IUnitOfWork
Dispose()
, который вызывается только контейнером DI.
Кто-нибудь может подумать о другой причине, по которой я мог получить эту ошибку?