【问题标题】:asp.net 5 DI: Using scoped service outside requestasp.net 5 DI:在请求之外使用范围服务
【发布时间】:2016-02-28 00:12:11
【问题描述】:

我们有一个 IOrderManager 服务,它使用通过 AddScoped() 在 DI 中注册的其他一些服务。 现在我们需要在 OnMessage 处理程序中为某个队列使用该服务,显然,该队列是在任何请求管道之外引发的。 所以当我们尝试使用类似

的东西来获得我们的服务时
var orderManager = ServiceProvider.GetRequiredService<IOrderManager>();

我们遇到“无法访问已处置的对象...”异常。

问题:是否有可能“告诉” DI 我们正在进行一些“虚假请求”处理以避免处置注册为“范围”的服务?

【问题讨论】:

  • 请提供更多信息。目前问题还不清楚。你从哪里得到orderManager?从哪里获取 serviceProvider?

标签: dependency-injection asp.net-core


【解决方案1】:

如果您的 IOrderManager 超出请求范围,您可以像这样为每个消息创建自定义范围:

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

【讨论】:

  • 有一个扩展方法,所以你可以把你的代码缩短为var serviceScope = app.ApplicationServices.CreateScope()
【解决方案2】:

如果您在IOrderManager 中使用范围服务,则IOrderManager 也需要范围。

如果你不这样做,当IOrderManager 实例第一次被创建时,它会从当前请求中“捕获”作用域的依赖。

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

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

如果您的IOrderManager 实际上不需要限定在请求范围内的信息,则不应对其进行限定,也不应使用同样限定在限定范围内的依赖项。

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

【讨论】:

    猜你喜欢
    • 2015-04-14
    • 1970-01-01
    • 2013-06-29
    • 2022-06-28
    • 2019-04-26
    • 1970-01-01
    • 2016-08-03
    • 2020-09-24
    • 1970-01-01
    相关资源
    最近更新 更多