2 回答
TA贡献1773条经验 获得超3个赞
IServiceProvider传入的实例Configure是scoped,这意味着它在完成后由框架处理-它创建的Configure任何范围内的服务也会在此过程中处理。
在您的示例中,您正在请求一个实例IIdeationManager(它是scoped),然后尝试在您的MqttBroker类中使用它(实际上是一个singleton)。当您尝试使用 的实现时IIdeationManager,由 DI 创建和连接的范围实例已被释放,因此抛出异常。CityOfIdeasDbContextObjectDisposedException
为了解决这个问题,您可以采用在单例需要访问范围服务时使用的通用模式:创建范围、解析服务、使用服务,然后处置范围。松散地,这看起来有点像这样:
using (var scope = serviceProvider.CreateScope())
{
var ideationManager = scope.ServiceProvider.GetService<IIdeationManager>();
// Do something with ideationManager.
}
// scope and all created disposable services have been disposed.
当您请求实现 时IIdeationManager,DI 系统发现(最终)它需要一个作用域CityOfIdeasDbContext并为您创建一个。一旦scope被处置,这个CityOfIdeasDbContext实例也被处置。
为了使其在您的示例中起作用,您MqttBroker可以将 的 实例IServiceProvider带入其构造函数并使用它来创建我上面显示的范围(它仍然可以IConfiguration按原样使用,因为它本身是一个单例)。
应该传递给类的实例不IServiceProvider应该是传递给类的MqttBroker实例——这已经确定了范围,并且正如我所描述的那样,将在完成后清理,这确实是您开始时遇到的问题。为此,请使用,它是根提供者并且没有作用域。IServiceProviderConfigureConfigureapp.ApplicationServices
- 2 回答
- 0 关注
- 164 浏览
添加回答
举报