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 同时实现了 IDisposableIAsyncDisposable,MS.DI 更愿意尽可能调用 IAsyncDisposable。这意味着它宁愿调用 DisposeAsync 并完全跳过 Dispose。当您调用 IServiceScope.DisposeAsync.

时会发生这种情况

在 ASP.NET Core 的上下文中,请求的 IServiceScope 将被异步处理,因此缺少对 Dispose.

的调用