关于c#:在抽象类中实现IDisposable

Implement IDisposable in abstract class

本问题已经有最佳答案,请猛点这里访问。

我有以下抽象类,需要实现IDisposable以确保始终正确地释放dbContent。

1
2
3
4
5
public abstract class DataRepositoryBase<T> : DataRepositoryBase<T, MainDbContext>
    where T : class, IIdentifiableEntity, new()
{

}

实现这一目标的最佳方法是什么?

请注意:我非常清楚如何在具体的类中使用IDisposable,但是在抽象类中实现这个功能-不太清楚

  • 有一些指导方针
  • 如果它是抽象的,为什么要向它添加具体的功能,如处理数据库?
  • @清理抽象类中创建的资源是正确的做法!
  • @Jamiec,我接受你的说法,因为我不使用抽象类;我使用接口。因此,实现类的责任就是自己决定是否需要处理任何东西。
  • @davidarno可以同时使用接口和抽象类。它们在不同的情况下有不同的用途。如果抽象类正在实现一个重要的样板函数体,然后由子类专门化,那么使用抽象类并实现IDisposable是绝对有意义的。在这种情况下使用接口将导致重复的代码,违反dry。我无法想象为什么你会完全忽视一种语言结构。
  • @Danielmann,简单的答案是:我会使用组合而不是继承。我忽略了继承,因为我们很清楚它会导致复杂、紧密耦合、难以测试的代码。因此,在本例中,我将注入使用IDispobable的eg idbcontent的实现。


我将采用此答案中提供的实现:

正确使用IDisposable接口

在派生类型中,如果派生类型还需要处理一些东西,记住调用base,则重写Dispose(bool disposing)方法。如果不需要,那么只需对基本实现做任何事情。

确保公开这种类型的公共合同上调用Dispose的必要性是有意义的,这可能是泄漏抽象的迹象(尽管并非总是如此)。

这至少是个好的开始。