.net NET核心-何时释放IServiceProvider?

erhoui1w  于 2023-01-14  发布在  .NET
关注(0)|答案(1)|浏览(179)

我遇到了在ASP.NET Core 3.1应用程序中释放IServiceProvider对象的问题:

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

我在Startup类的ConfigureServices方法中捕获IServiceProvider对象,并在BackgroundService中使用它。大多数时候,这工作正常,但偶尔会抛出ObjectDisposedException。我可以理解,ConfigureServices中的IServiceProvider没有缩进以这样使用。所以我想知道:

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

fwzugrvs1#

使用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);            
}

相关问题