ASP.NET Core - IServiceProvider 何时释放?

Mic*_*hal 6 .net c# .net-core asp.net-core asp.net-core-3.1

我在 ASP.NET Core 3.1 应用程序中面临处置 IServiceProvider 对象的问题:

System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'IServiceProvider'.
Run Code Online (Sandbox Code Playgroud)

我正在类中的方法IServiceProvider内捕获对象并在. 大多数情况下,这工作正常,但偶尔会被抛出。我可以理解in不应该这样使用。所以我想知道:ConfigureServicesStartupBackgroundServiceObjectDisposedExceptionIServiceProviderConfigureServices

  • 什么时候被Dispose/DisposeAsync召唤IServiceProvider?什么是ServiceProvider生命周期?
  • IServiceProvider在BackgroundService 中引用ASP.NET Core 的正确方法是什么?我应该在那里使用IServiceScopeFactory并创建新的范围吗?

d_f*_*d_f 5

使用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.GetRequiredService<IMediator>();
                    var request = RunFooJob.Command.Create(job);
                    return await mediator.Send(request);
                });
    return StatusCode(StatusCodes.Status200OK);            
}
Run Code Online (Sandbox Code Playgroud)