gpt4 book ai didi

c# - 为什么我在开发环境中只会收到范围内的服务解析错误?

转载 作者:行者123 更新时间:2023-12-05 01:11:25 27 4
gpt4 key购买 nike

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


我有一个使用 .NET Generic Host 的 .NET Core 3.1 控制台应用程序用于依赖注入(inject)。在其中,我有一个 EF Core DbContext 定义为使用 AddDbContext 进行数据库访问的范围服务,如下所示:

var host = Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
var configuration = hostContext.Configuration;

services
.AddDbContext<BotDbContext>(options =>
{
options
.UseLazyLoadingProxies()
.UseSqlite(configuration.GetConnectionString("Database"));
});
});
var db = host.Services.GetRequiredService<BotDbContext>();

最初,我使用环境 (DOTNET_ENVIRONMENT) 作为 Production 进行测试,这是默认设置。一切正常。

我想要一个单独的 Development 环境,以更接近地模仿默认的 ASP.NET Core 模板。为此,我定义了一个调试时环境变量 DOTNET_ENVIRONMENT=Development

当我这样做时,我收到了以下异常:

System.InvalidOperationException: 'Cannot resolve scoped service 'MyNamespace.Data.BotDbContext' from root provider.'

为什么这个异常只发生在环境是Development,而不是Production的时候?

最佳答案

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

enables scope validation on the dependency injection container when EnvironmentName is 'Development'

我们还可以在source code中看到它设置了ValidateScopes仅在开发环境中的 ServiceProvider 上。

使用此配置,在开发环境之外,配置的 ServiceProvider 将愉快地返回作用域上下文之外的作用域服务(尽管永远不应依赖这一点;这些服务是有作用域的!)。

关于c# - 为什么我在开发环境中只会收到范围内的服务解析错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63209372/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com