我正在为我的EntityFramework创建一个ServiceLayer。
服务层使用实现IDisposable的存储库。由于我没有在我的Service类中实现IDisposable,我应该使用Destructor来处置对象,还是GC会自动处理它们。
public class ProductService
{
private readonly ProductRepository _productRepository;
public ProductService(ProductRepository repo)
{
_productRepository = repo;
}
......
......
~ProductService()
{
_productRepositort.Dispose();
}
}
答案 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)
在此处查看IDisposable模式http://msdn.microsoft.com/en-US/library/b1yfkh5e(v=vs.110).aspx