当“ASPNETCORE_ENVIRONMENT”:“开发”时,无法从根提供程序解析范围服务

问题描述 投票:0回答:1

尝试解决此类服务时遇到异常

IApplicationBuilder.ApplicationServices.GetServices<AdminPanelDbContext>();
并且
"ASPNETCORE_ENVIRONMENT": "Development"
设置为开发。

例外:

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

但是当我设置

"ASPNETCORE_ENVIRONMENT": "Production"
时一切正常。

我看了下

appsettnings.Development.json
,和
appsettings.json
没有什么不同。还有其他设置会影响这个吗?

c# dependency-injection asp.net-core-3.1
1个回答
17
投票

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

当应用程序在开发环境中运行并调用

CreateDefaultBuilder
来构建主机时,默认服务提供者会执行检查以验证:

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

[...]

作用域服务由创建它们的容器处理。如果在根容器中创建作用域服务,则该服务的生命周期将有效提升为单例,因为它仅在应用程序关闭时由根容器释放。当调用

BuildServiceProvider
时,验证服务范围可以捕获这些情况。

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

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

对我来说,当前实现的缺点是,当您在生产环境中运行时,此验证实际上是默认禁用的。验证应该在所有环境中默认开启,因为忽略警告将导致多线程问题和内存泄漏。

© www.soinside.com 2019 - 2024. All rights reserved.