我在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);
}