当 "ASPNETCORE_ENVIRONMENT": "Development" 时,无法从根提供程序解析范围服务

Gen*_*ato 4 c# dependency-injection asp.net-core-3.1

尝试解决这样的服务IApplicationBuilder.ApplicationServices.GetServices<AdminPanelDbContext>();"ASPNETCORE_ENVIRONMENT": "Development"设置为开发时出现异常。

例外:

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

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

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

Ste*_*ven 7

请参阅ASP.NET Core 中的依赖注入 - 范围验证

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

  • 范围服务不是从根服务提供者解析的。
  • 范围服务不会注入到单例中。

[...]

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

有关更多信息,请参阅范围验证

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

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

  • 您可以使用扩展方法 UseDefaultServiceProvider 并将 ValidateScopes 设置为 true 以在所有环境中获得相同的验证。 (3认同)