7

我被告知我需要dispose of instances of my Entity Framework repository classes,并且我创建了一个基类来执行此实现。我必须在所有类上实现IDisposable,还是基类足够?

我需要与专家核对:是否可以通过基类实现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); 
    } 
} 

回答

4

这取决于你是否有在派生类中需要的资源被处置。如果有特定于派生类的资源,则仅在基类上实现IDisposable将不够。

+0

在我的情况下,我的继承库中没有本地的东西。如果是这种情况,那么我的CompanyRepository的实现是完整的? – LamonteCristo

+0

如果派生类中没有任何内容需要显式处置,那么基类实现可能就足够了。 –

+1

只有基类应该实现*'IDisposable'。派生类通常应该通过重写'Dispose(bool)'来添加它们的清除代码,而不是添加'IDisposable.Dispose()'的新实现。 – supercat

0

NO。你也有分班。

如果你愿意,GC仍然需要将其孩子的身份映射为未引用 - 然后收集它们......所以你没有任何收入。

+0

处置与gc无关。处理模式用于释放非托管资源,gc用于托管内存。这个答案没有意义。 –

1

一般说来,你必须在每个班级都实施IDispoable,在这里你有私人成员,他们自己实施IDisposable。这些资源必须被“释放”。我强烈建议你阅读关于IDisposable模式的非常好的论文CodeProject

7

答案是“视情况而定”。

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

“超类”可能是基类;它可能是一个或多个子类。

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

恕我直言...

这里是MSDN不得不说:

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

当您从一次性类型派生,而派生类型不 引入任何新的资源,那么没有什么特别的需要做。 基本类型IDisposable实现将负责清理 其资源,并且您的子类可以非常不知道 的详细信息。

< =换句话说,你不一定要重新实现处置遍地

...但是...

然而,这也是常见的有确实包含需要清理的新资源 的子类。在这种情况下,您的课程需要 才能释放其资源,同时确保基本类型的 资源也得到释放。通过重写清理方法, 释放你的资源,然后调用基类清理 资源,如图做到这一点6.

+1

+1对于文章 – LamonteCristo

0

使用基类可以很好地配置。这里重要的是清理非托管资源,在这种情况下意味着关闭数据库连接。我认为你最好是通过httpmodules或动作过滤器来处理你的工作单元,然后做一个单位工作单元的每个请求类型的设置。您只需确保在存储库实例上调用dispose,并拥有一个处理实体框架上下文的基类就可以了(即使将它们与过滤器/模块配置在一起,您仍然可以使用这些存储库的基类)。

相关问题