我有一个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()
?我想让存储库自动清理自身(如果未明确处置)。 最佳答案
我的问题是,即使我没有显式调用Dispose(),为什么也已经丢弃了Transaction?
也许交易的终结者首先运行。请记住,死对象的终结器可以以任何顺序在任何线程上运行,并且在终结之前不必进行正确的初始化。如果您不了解终结器的所有规则,则在尝试编写任何更多使用终结器的代码之前,请全面了解它们。这是最难解决的事情之一。
看起来您好像错误地实施了一次性模式,这将使您充满悲痛。阅读模式并正确执行;终结者不应处置已处置的东西:
http://msdn.microsoft.com/en-us/magazine/cc163392.aspx
关于c# - 为什么在终结器中调用Dispose()导致ObjectDisposedException?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4189732/