C# 为什么我只能在开发环境中得到作用域服务解析错误?

C# 为什么我只能在开发环境中得到作用域服务解析错误?,c#,.net-core,dependency-injection,C#,.net Core,Dependency Injection,我知道下面描述的错误的原因是我需要一个作用域来实例化服务,这可以通过使用Services.CreateScope()和匹配的.Dispose()/来完成。问题是为什么我在开发环境和产品环境中有不同的行为 我有一个.NET Core 3.1控制台应用程序,它使用。在其中,我使用AddDbContext将EF-Core-DbContext定义为数据库访问的作用域服务,如下所示: var host=host.CreateDefaultBuilder(args) .ConfigureServices(

我知道下面描述的错误的原因是我需要一个作用域来实例化服务,这可以通过使用
Services.CreateScope()
和匹配的
.Dispose()
/
来完成。问题是为什么我在开发环境和产品环境中有不同的行为


我有一个.NET Core 3.1控制台应用程序,它使用。在其中,我使用
AddDbContext
将EF-Core-DbContext定义为数据库访问的作用域服务,如下所示:

var host=host.CreateDefaultBuilder(args)
.ConfigureServices((主机上下文,服务)=>
{
var-configuration=hostContext.configuration;
服务
.AddDbContext(选项=>
{
选择权
.UseLazyLoadingProxies()
.UseSqlite(configuration.GetConnectionString(“数据库”));
});
});
var db=host.Services.GetRequiredService();
最初,我使用环境(
DOTNET\u环境
)作为
产品
,作为默认设置来测试这一点。一切顺利

我想要一个单独的
开发
环境,以更接近地模拟默认的ASP.NET核心模板。为此,我定义了一个调试时环境变量
DOTNET\u environment=Development

当我这样做时,我收到了以下例外情况:

System.InvalidOperationException:'无法从根提供程序解析作用域服务'MyNamespace.Data.BotDbContext'


为什么只有当环境是
开发
,而不是
生产
时才会发生此异常?

您已经使用
CreateDefaultBuilder
创建了主机。仔细观察,我们可以看到一个默认配置项:

当EnvironmentName为“Development”时,在依赖项注入容器上启用范围验证

我们还可以从中看到,它仅在开发环境中设置在ServiceProvider上

通过这种配置,在开发环境之外,配置的服务提供者将愉快地返回范围上下文之外的范围服务(尽管这永远不应该被依赖;这些服务的范围是有原因的!)