我正在研究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范围验证(不推荐)。