У меня есть репозиторий NHibernate, который выглядит следующим образом:
public class NHibRepository : IDisposable
{
public ISession Session { get; set; }
public ITransaction Transaction { get; set; }
// constructor
public NHibRepository()
{
Session = Database.OpenSession();
}
public IQueryable<T> GetAll<T>()
{
Transaction = Session.BeginTransaction();
return Session.Query<T>();
}
public void Dispose()
{
if (Transaction != null && Transaction.IsActive)
{
Transaction.Rollback(); // ObjectDisposedException on this line
}
Session.Close();
Session.Dispose();
}
~NHibRepository()
{
Dispose();
}
}
Когда я использую репозиторий вот так, он работает нормально:
using (var repo = new NHibRepository())
{
Console.WriteLine(repo.GetAll<Product>().Count());
}
Но когда я использую его так, он выдаст ObjectDisposedException
:
var repo = new NHibRepository();
Console.WriteLine(repo.GetAll<Product>().Count());
Простым решением будет всегда явная дипозировка хранилища, но, к сожалению, я не контролирую жизненный цикл некоторых классов, использующих хранилище.
Мой вопрос таков: почему утилизируется Transaction
, хотя я явно не вызывал Dispose()
?Я бы хотел, чтобы хранилище автоматически очищалось, если оно не было удалено явно.