我有一个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/

10-11 20:36