ASP.Net Core 如何在应用程序即将停止时对数据库执行最终操作

Naz*_*nyk 7 c# database asp.net-core

我正在开发 ASP.NET Core 3.1 应用程序。我想在我的应用程序即将停止时执行一些与数据库相关的最终操作。为此,我试图在我的范围服务中调用一个函数,该函数是数据库和 ASP.NET Core 之间的附加层。

启动文件

public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime)
{
    lifetime.ApplicationStopping.Register(() =>
    {
        app.ApplicationServices.GetService<MyService>().SynchronizeChanges();
    });
}
Run Code Online (Sandbox Code Playgroud)

但不幸的Cannot resolve scoped service 'MyApplication.Services.MyService' from root provider是,我在尝试时出错。

ing*_*var 3

应用程序关闭时没有作用域,因此 Asp.Net core 无法创建作用域服务。仅在 http 请求期间创建范围。如果您确实需要创建没有范围的范围服务,您可以手动创建范围:

public void Configure(IApplicationBuilder app, IHostApplicationLifetime lifetime)
{
    lifetime.ApplicationStopping.Register(() =>
    {
        using (var scope = app.ApplicationServices.CreateScope())
        {
            scope.ServiceProvider
              .GetRequiredService<MyService>().SynchronizeChanges();
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

您也可以将您的服务注册为单例或尝试禁用 Asp.Net Core 范围验证(不推荐)。