我们有一个IOrderManager服务,它使用通过AddScoped()在DI中注册的一些其他服务。 现在我们需要在OnMessage处理程序中为某个队列使用该服务,这显然是在任何请求管道之外引发的。 因此,当我们尝试使用类似
之类的东西来获取服务时var orderManager = ServiceProvider.GetRequiredService<IOrderManager>();
我们得到了“无法访问被处置对象......”例外。
问题:是否有可能“告诉”DI我们在某些“假请求”处理中,以避免处置注册为“作用域”的服务?
答案 0 :(得分:3)
如果您的IOrderManager
超出了请求范围,则可以按照以下方式创建自定义范围:
using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
var myService = serviceScope.ServiceProvider.GetRequiredService<MyService>();
}
答案 1 :(得分:1)
如果您在IOrderManager
内使用作用域服务,IOrderManager
也需要作用域。
如果您不这样做,首次创建IOrderManager
实例时,它将会捕获&#34;来自当前请求的范围依赖关系。
将来IOrderManager
的任何使用将继续使用旧的作用域依赖项,而不是当前请求范围的依赖项。
接下来,您应该使用作用域依赖项的唯一原因是它们是否以某种方式在单个请求中维护状态,并且需要将该状态与其他请求隔离开来。
如果您的IOrderManager
实际上并不需要作用于请求的信息,那么它不应该是作用域的,也不应该使用也是作用域的依赖项。
换句话说,如果您认为它应该在活动请求之外可用,那么根据定义它不是作用域的,不需要作用域依赖。