ASP.NET核心-何时释放IServiceProvider



我在ASP中处理IServiceProvider对象时遇到问题。NET Core 3.1应用程序:

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'IServiceProvider'.

我在Startup类的ConfigureServices方法中捕获IServiceProvider对象,并在BackgroundService中使用它。大多数情况下,这都很好,但偶尔会抛出ObjectDisposedException。我可以理解ConfigureServices中的IServiceProvider并没有缩进以便这样使用。所以我想知道:

  • 何时在IServiceProvider上调用Dispose/DisposeAsync?什么是ServiceProvider生命周期
  • 在ASP中引用CCD_ 11的正确方式是什么。NET核心在BackgroundService?我应该使用IServiceScopeFactory并在那里创建新的作用域吗

使用IServiceScopeFactory,它是设计用于安全和可控地解决其他服务的单机版。它是一个创建IServiceScope实例的工厂,只有IServiceScope CreateScope()方法可以在一个范围内创建服务。一旦这被处置,已经从IServiceScope.ServiceProvider解析的任何作用域服务也将被处置。

现实生活中的例子:

[HttpPost]
public IActionResult FooJob([FromServices] IServiceScopeFactory resolver, JobContract job)
{
//long running task
_ = Task.Run(async () =>
{
using var scope = resolver.CreateScope();
var svcProvider = scope.ServiceProvider(); //Scopped lifetime
var mediator = svcProvider.GetService<IMediator>();
var request = RunFooJob.Command.Create(job);
return await mediator.Send(request);
});
return StatusCode(StatusCodes.Status200OK);            
}

最新更新