DbContext 未使用依赖注入处理
DbContext not Disposed using dependencyinjection
以最简单的形式,我创建了一个新的 mvc 核心项目,并创建了一个 class:
public class Test : IDisposable
{
public void Dispose()
{
}
}
已注册
services.AddScoped<Test>();
并在控制器的构造函数中使用它
public HomeController(ILogger<HomeController> logger, Test t)
{
_logger = logger;
}
当我在 Test.Dispose() 设置断点时,它在加载主页后按预期命中。
现在我将测试 class 更改如下:
public class Test : DbContext
{
public override void Dispose()
{
}
}
现在不再调用 Disposed 了...这是为什么???
我也试过了
services.AddDbContext<Test>();
而不是 AddScoped,但这没有区别。
我需要更改什么才能使容器调用 dispose 与第一种情况一样?
(相关Question without answer)
您需要重写 Dispose(bool)
方法而不是(通常)非虚 Dispose()
方法。试试这个:
protected override void Dispose(bool disposing)
{
// implementation
}
并设置断点看是否命中。这里有更多关于区别的信息:
https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose
如果 class 同时实现了 IDisposable
和 IAsyncDisposable
,MS.DI 更愿意尽可能调用 IAsyncDisposable
。这意味着它宁愿调用 DisposeAsync
并完全跳过 Dispose
。当您调用 IServiceScope.DisposeAsync
.
时会发生这种情况
在 ASP.NET Core 的上下文中,请求的 IServiceScope
将被异步处理,因此缺少对 Dispose
.
的调用
以最简单的形式,我创建了一个新的 mvc 核心项目,并创建了一个 class:
public class Test : IDisposable
{
public void Dispose()
{
}
}
已注册
services.AddScoped<Test>();
并在控制器的构造函数中使用它
public HomeController(ILogger<HomeController> logger, Test t)
{
_logger = logger;
}
当我在 Test.Dispose() 设置断点时,它在加载主页后按预期命中。
现在我将测试 class 更改如下:
public class Test : DbContext
{
public override void Dispose()
{
}
}
现在不再调用 Disposed 了...这是为什么???
我也试过了
services.AddDbContext<Test>();
而不是 AddScoped,但这没有区别。
我需要更改什么才能使容器调用 dispose 与第一种情况一样?
(相关Question without answer)
您需要重写 Dispose(bool)
方法而不是(通常)非虚 Dispose()
方法。试试这个:
protected override void Dispose(bool disposing)
{
// implementation
}
并设置断点看是否命中。这里有更多关于区别的信息: https://docs.microsoft.com/en-us/dotnet/standard/garbage-collection/implementing-dispose
如果 class 同时实现了 IDisposable
和 IAsyncDisposable
,MS.DI 更愿意尽可能调用 IAsyncDisposable
。这意味着它宁愿调用 DisposeAsync
并完全跳过 Dispose
。当您调用 IServiceScope.DisposeAsync
.
在 ASP.NET Core 的上下文中,请求的 IServiceScope
将被异步处理,因此缺少对 Dispose
.