簡體   English   中英

ASP.NET Core - IServiceProvider什么時候處理掉?

[英]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生命周期?
  • 在 BackgroundService 的 ASP.NET Core 中引用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM