控制器和 IDisposable

Controllers and IDisposable

如果我使控制器实现 IDisposable,我假设 Dispose 方法仍然不会被 GC 调用。所以这意味着我必须添加:

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 是一种不好的做法,应尽可能避免。

我遇到的问题是我的 "services" 是在默认构造函数中创建的,它不允许我使用 using 语句来控制每个服务的生命周期。那么,处理这个问题的正确方法是什么?

如果您可以覆盖 protected void Dispose(bool disposing),则意味着基础 class 使用 Disposable pattern,并且已经实现了 IDisposable.

只需删除 IDisposable 接口和 public void Dispose() 方法,它应该可以工作。

WebAPI的ApiController已经实现了IDisposable并提供了方便开发者重写的虚方法,也就是您正在使用的Dispose(bool)方法。所以你需要做的就是删除你自己的布尔标志,只检查 disposing 参数。

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        DAL.Dispose();
    }
    base.Dispose(disposing);
}

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

由于控制器是根据请求实例化的,因此您可以在 'using' 块中的操作本身中创建服务。服务的生命周期始终限于操作。