我必须在所有类上实现IDisposable,还是基类足够?

goo*_*ate 7 .net c# garbage-collection idisposable entity-framework-4.1

我被告知我需要处理我的Entity Framework存储库类的实例,并创建了一个基类来强制执行此实现.

我需要咨询专家:IDisposable通过基类实现是否可以接受?

请注意,存储库类没有类成员变量.

/// Sample repository.  Note that I return List<T> as IEnumerable, 
/// and I use IDisposable 
///
public class CompanyRepository : DisposableBase, ICompanyRepository
{
    public IEnumerable<CompanyDetail> GetOneCompany(int? CompanyID)
    {
        var t = from c in _entities.CompanyDetail
                where c.CompanyID == CompanyID.Value
                select c;
        return t.ToList();
    }
}

/// <summary>
/// Disposable implementation based on advice from this link:
/// from Http://www.asp.net/entity-framework/tutorials/implementing-the-repository-and-unit-of-work-patterns-in-an-asp-net-mvc-application
/// </summary>
public class DisposableBase : IDisposable
{
    protected TLSAdminEntities1 _entities;

    public DisposableBase()
    {
        _entities = new TLSAdminEntities1();
        disposed = false;
    }

    private bool disposed ;
    protected virtual void Dispose(bool disposing)
    {
        if (!this.disposed)
        {
            if (disposing)
            {
                _entities.Dispose();
            }
        }
        this.disposed = true;
    }
    public void Dispose()
    {
        Dispose(true);
        GC.SuppressFinalize(this);
    }
}
Run Code Online (Sandbox Code Playgroud)

pau*_*sm4 7

答案是"它取决于".

如果某个超类中的"Dispose()"方法足够,那么你肯定不需要在每个子类中重新实现它.

"超类"可能是基类; 它可能是一个或多个子类.

这取决于您分配的内容以及需要清理的内容.

恕我直言...

这是MSDN所说的:

http://msdn.microsoft.com/en-us/magazine/cc163392.aspx

当您从一次性类型派生,并且派生类型不引入任何新资源时,则不需要做任何特殊处理.基本类型IDisposable实现将负责清理其资源,您的子类可能会对细节一无所知.

<=换句话说,您不必一遍又一遍地重新实现Dispose

......但......

但是,拥有一个包含需要清理的新资源的子类也很常见.在这种情况下,您的类需要释放其资源,同时确保基类型的资源也被释放.通过重写清理方法,释放资源,然后调用基类型来清理其资源来完成此操作,如图6所示.


Jam*_*son 4

这取决于派生类中是否有需要释放的资源。如果存在特定于派生类的资源,IDisposable仅在基类上实现是不够的。