【问题标题】:Cannot resolve scoped service from root provider when "ASPNETCORE_ENVIRONMENT": "Development"当“ASPNETCORE_ENVIRONMENT”:“开发”时,无法从根提供程序解析范围服务
【发布时间】:2020-09-24 23:28:20
【问题描述】:

我在尝试解决此类服务时遇到异常 IApplicationBuilder.ApplicationServices.GetServices<AdminPanelDbContext>();"ASPNETCORE_ENVIRONMENT": "Development" 设置为开发。

例外:

无法从根提供程序解析范围服务“AdminPanel.DAL.DbContexts.AdminPanel.AdminPanelDbContext”。

但是当我设置"ASPNETCORE_ENVIRONMENT": "Production" 时一切正常。

我看了下appsettnings.Development.json,和appsettings.json没什么不同。是否有任何其他设置会影响这一点?

【问题讨论】:

  • 你为什么要从我假设的IApplicationBuilder 中获取服务? (XY 问题?)
  • 猜测一下。在 Startup.Configure 方法中访问范围服务是一个错误,在发布环境中可能会被原谅。您应该创建一个新的服务范围,并可能将其移至 IHostedService
  • @JeremyLakeman,是的,它是IApplicationBuilder。我已经这样做了 using (IServiceScope scopeServiceProvide = IApplicationBuilder.ApplicationServices.CreateScope()) 但想知道为什么会这样。

标签: c# dependency-injection asp.net-core-3.1


【解决方案1】:

Dependency injection in ASP.NET Core - Scope validation:

当应用在开发环境中运行并调用CreateDefaultBuilder 构建主机时,默认服务提供者会执行检查以验证:

  • 没有从根服务提供者解析范围内的服务。
  • 作用域服务不会注入到单例中。

[...]

作用域服务由创建它们的容器处理。如果在根容器中创建范围服务,则服务的生命周期有效地提升为单例,因为它仅在应用关闭时由根容器释放。验证服务范围会在调用 BuildServiceProvider 时捕获这些情况。

如需了解更多信息,请参阅Scope validation

此功能是 ASP.NET Core v3 中的新功能。以前版本的 ASP.NET Core 缺少此功能。

对我来说,这个功能的缺点是当你在生产中运行时它实际上是默认禁用的。它应该在所有环境中默认开启,因为它会导致多线程问题和内存泄漏。

【讨论】:

    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2020-09-06
    • 2020-08-01
    • 2020-05-11
    • 2020-02-22
    • 1970-01-01
    • 2020-05-22
    • 2022-10-18
    相关资源
    最近更新 更多