[英]ASP.NET Core - When is IServiceProvider disposed?
我在 ASP.NET Core 3.1 應用程序中面臨處置 IServiceProvider object 的問題:
System.ObjectDisposedException: Cannot access a disposed object.
Object name: 'IServiceProvider'.
我在Startup
class 中的ConfigureServices
方法中捕獲IServiceProvider
object 並在BackgroundService
中使用它。 大多數時候這工作正常,但偶爾會拋出ObjectDisposedException
。 我可以理解ConfigureServices
中的IServiceProvider
不應該那樣使用。 所以我想知道:
IServiceProvider
上調用Dispose/DisposeAsync
? 什么是ServiceProvider
生命周期?IServiceProvider
的正確方法是什么? 我應該使用IServiceScopeFactory
並在那里創建新的 scope 嗎? 使用IServiceScopeFactory
,它在設計上是單調的,用於安全和受控地解析其他服務。 它是一個用於創建IServiceScope
實例的工廠,只有IServiceScope CreateScope()
方法可以在 scope 中創建服務。一旦它被處理掉,任何已經從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);
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.