控制器和 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' 块中的操作本身中创建服务。服务的生命周期始终限于操作。
如果我使控制器实现 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' 块中的操作本身中创建服务。服务的生命周期始终限于操作。