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

Startup.cs

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

但是很不幸,我尝试这样做时遇到Cannot resolve scoped service 'MyApplication.Services.MyService' from root provider错误。

最佳答案

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

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

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

08-27 18:25