Dependency injection asp.net 5 DI:在请求外部使用作用域服务

Dependency injection asp.net 5 DI:在请求外部使用作用域服务,dependency-injection,asp.net-core,Dependency Injection,Asp.net Core,我们有一个IOrderManager服务,它使用通过addScope()在DI中注册的一些其他服务。 现在,我们需要在OnMessage处理程序中为一些队列使用该服务,显然,这些队列是在任何请求管道之外提出的。 因此,当我们尝试使用以下方式获得服务时 var orderManager = ServiceProvider.GetRequiredService<IOrderManager>(); var orderManager=ServiceProvider.GetRequiredS

我们有一个IOrderManager服务,它使用通过addScope()在DI中注册的一些其他服务。 现在,我们需要在OnMessage处理程序中为一些队列使用该服务,显然,这些队列是在任何请求管道之外提出的。 因此,当我们尝试使用以下方式获得服务时

var orderManager = ServiceProvider.GetRequiredService<IOrderManager>();
var orderManager=ServiceProvider.GetRequiredService();
我们遇到“无法访问已处置对象…”异常


问题:是否可以“告诉”DI我们正在进行一些“假请求”处理,以避免处理注册为“作用域”的服务?

如果您在
IOrderManager
中使用作用域服务,
IOrderManager
也需要作用域

如果不这样做,则在首次创建
IOrderManager
实例时,它将从当前请求“捕获”范围内的依赖项

任何未来使用的
IOrderManager
都将继续使用旧的作用域依赖项,而不是当前请求作用域的依赖项

接下来,您应该使用作用域依赖项的唯一原因是,它们以某种方式在单个请求中维护状态,并且需要将该状态与其他请求隔离开来


如果您的
IOrderManager
实际上不需要限定到请求范围的信息,那么它不应该限定范围,也不应该使用同样限定范围的依赖项


换句话说,如果您认为它应该在活动请求之外可用,则根据定义,它不属于作用域,不需要作用域依赖项。

如果您在
IOrderManager
中使用作用域服务,
IOrderManager
也需要确定作用域

如果不这样做,则在首次创建
IOrderManager
实例时,它将从当前请求“捕获”范围内的依赖项

任何未来使用的
IOrderManager
都将继续使用旧的作用域依赖项,而不是当前请求作用域的依赖项

接下来,您应该使用作用域依赖项的唯一原因是,它们以某种方式在单个请求中维护状态,并且需要将该状态与其他请求隔离开来


如果您的
IOrderManager
实际上不需要限定到请求范围的信息,那么它不应该限定范围,也不应该使用同样限定范围的依赖项


换句话说,如果您认为它应该在活动请求之外可用,则根据定义,它不属于作用域,也不需要作用域依赖项。

如果您的
IOrderManager
在请求作用域之外,您可以按如下方式为每条消息创建自定义作用域:

using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
    var myService = serviceScope.ServiceProvider.GetRequiredService<MyService>();
}
使用(var serviceScope=app.ApplicationServices.GetRequiredService().CreateScope())
{
var myService=serviceScope.ServiceProvider.GetRequiredService();
}

如果您的
IOrderManager
不在请求范围内,您可以按以下方式为每条消息创建自定义范围:

using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>().CreateScope())
{
    var myService = serviceScope.ServiceProvider.GetRequiredService<MyService>();
}
使用(var serviceScope=app.ApplicationServices.GetRequiredService().CreateScope())
{
var myService=serviceScope.ServiceProvider.GetRequiredService();
}

请提供更多信息。目前这个问题还不清楚。你从哪里得到orderManager?从哪里获得服务提供商?请提供更多信息。目前这个问题还不清楚。你从哪里得到orderManager?从何处获取serviceProvider?有一个扩展方法,因此您可以将代码缩短为
var serviceScope=app.ApplicationServices.CreateScope()
有一个扩展方法,因此您可以将代码缩短为
var serviceScope=app.ApplicationServices.CreateScope()