【问题标题】:cannot consume a scoped service from singleton不能使用来自单例的作用域服务
【发布时间】:2023-02-12 19:22:17
【问题描述】:

我收到上述错误并且我知道为什么,但是我看到奇怪的行为它只发生在我们的开发环境中而不是例如我们的暂存或生产环境中并且它是完全相同的代码。 在启动时有:

services.AddSingleton<ExcahngeService>();
services.AddScoped<ITradingService, TradingService>();

这会引发错误: “不能使用来自单例的作用域服务”

但它只发生在开发环境中,并且在所有环境中都是相同的代码

这可能是由于时间问题,环境较慢?

【问题讨论】:

  • 您可以参考link 了解更多关于 scoped 和 singleton 的生命周期。
  • 你只在你的开发环境中看到这个错误的原因是因为微软决定(可能是因为性能问题)当应用程序在开发模式下运行时只检查这些类型的问题。有关更多信息,请阅读this
  • 谢谢@Steven 我们仍然需要更正我们的代码,以便我们在开发中有一个可行的解决方案。
  • 即使您在开发环境中看到错误,错误仍然存​​在,因为在单例中注入作用域实例很可能是错误。即使您没有在生产环境中看到异常,您的程序也很可能无论如何都被破坏了。解决这个问题非常重要。

标签: asp.net-core dependency-injection singleton scoped


【解决方案1】:

Scoped instance lifetime is limited, it is only available per request.因此,您正在将 Scoped 服务中的一个实例消耗到 Singleton 中,并且由于处理了范围服务而引发了错误。要么让Singleton要么Scoped

【讨论】:

    【解决方案2】:

    作为 Microsoft 的最佳实践,您应该创建新范围并从 ServiceProvider 获取范围内的服务 https://learn.microsoft.com/en-us/dotnet/core/extensions/scoped-service

    【讨论】:

      猜你喜欢
      • 2019-04-27
      • 1970-01-01
      • 2021-04-28
      • 2022-09-29
      • 2011-11-27
      • 1970-01-01
      • 2016-08-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多