控制器和IDisposable

时间:2016-06-22 11:31:45

标签: c# asp.net-web-api asp.net-web-api2 idisposable

如果我创建一个控制器实现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语句来控制每个服务的生命周期。那么,处理这个问题的正确方法是什么?

3 个答案:

答案 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)

在构造函数中创建服务有什么特定原因吗?

由于控制器是根据请求实例化的,因此您可以在“使用”块内的操作本身中创建服务。服务的生命周期仅限于行动。