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的必要性是有意义的,这可能是泄漏抽象的迹象(尽管并非总是如此)。
这至少是个好的开始。