从IDisposable继承时,我应该使用析构函数吗?

时间:2014-01-11 18:58:58

标签: c# .net entity-framework destructor

我正在为我的EntityFramework创建一个ServiceLayer。

服务层使用实现IDisposable的存储库。由于我没有在我的Service类中实现IDisposable,我应该使用Destructor来处置对象,还是GC会自动处理它们。

public class ProductService
{
    private readonly ProductRepository _productRepository;

    public ProductService(ProductRepository repo)
    {
        _productRepository = repo;
    }

    ......
    ......

    ~ProductService()
    {
        _productRepositort.Dispose();
    }

}

6 个答案:

答案 0 :(得分:4)

处置与垃圾收集器无关。它更多的是关闭数据库连接,文件句柄等。

如果您使用的是一次性用品,您的班级也应该是一次性的,并使用dispose pattern

处理这些物品

答案 1 :(得分:2)

  

由于我没有在我的Service类中实现IDisposable,我应该这样做   使用析构函数来处置对象

不得在终结器中调用IDisposable.Dispose,因为它用于非托管资源清理。并且,在出现SafeHandle之后,您应该考虑使用SafeHandle而不是实现终结器。

必须在其他地方调用IDisposable.Dispose,因为当它释放对象的内存时,GC不会调用Dispose。当您致电Dispose时,地点和时刻取决于创建IDisposable实施的人员,地点和时间。

通常,Dispose由创建IDisposable的对象调用。

答案 2 :(得分:0)

答案取决于存储库实例的范围。它在哪里创建以及对象可用多长时间。或者您是否使用DI注册存储库?

答案 3 :(得分:0)

如果您正在使用创建此ProductService的IoC并且ProductRepository具有一些LifeTime,那么IoC应该调用DisposeproductRepository。它对Web应用程序很有用,并且当生命周期设置为只有一个HttpRequest时。

如果您使用不带using关键字的ProductRepository,或者您没有手动调用Dispose方法,则GC不会调用Dispose。 GC将只调用析构函数,它不会调用Dispose方法。

答案 4 :(得分:-1)

如果接口是COM类,则是, COM类应该手动处理。

答案 5 :(得分:-3)