如果我创建一个控制器实现IDisposable
,我假设GC仍然不会调用Dispose
方法。所以这意味着我必须添加:
public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}
protected override void Dispose(bool disposing)
{
if (!isDalDisposed)
{
isDalDisposed = true;
if (disposing)
DAL.Dispose();
}
base.Dispose(disposing);
}
我已经读过,使用Object.Finalize
是不好的做法,应尽可能避免使用。
我遇到的问题是我的“服务”是在默认构造函数中创建的,它不允许我使用using
语句来控制每个服务的生命周期。那么,处理这个问题的正确方法是什么?
答案 0 :(得分:6)
Web API的ApiController
已经实现了IDisposable
,并为开发人员提供了方便的虚拟方法,即您正在使用的Dispose(bool)
方法。所以你需要做的就是删除你自己的布尔标志,只检查disposing
参数。
protected override void Dispose(bool disposing)
{
if (disposing)
{
DAL.Dispose();
}
base.Dispose(disposing);
}
答案 1 :(得分:3)
如果您可以覆盖protected void Dispose(bool disposing)
,则意味着基类使用Disposable pattern,并且已经实现了IDisposable
。
只需删除IDisposable
界面和public void Dispose()
方法,它就可以正常工作。
答案 2 :(得分:1)
在构造函数中创建服务有什么特定原因吗?
由于控制器是根据请求实例化的,因此您可以在“使用”块内的操作本身中创建服务。服务的生命周期仅限于行动。