我遇到了在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
并在那里创建新的作用域吗?
1条答案
按热度按时间fwzugrvs1#
使用
IServiceScopeFactory
(按设计为单音调)安全、可控地解析其他服务。它是用于创建IServiceScope
示例的工厂,具有在作用域内创建服务的唯一IServiceScope CreateScope()
方法。释放此方法后,也将释放已从IServiceScope.ServiceProvider
解析的任何作用域服务。现实生活示例: