首页 > 解决方案 > 为什么我只会在开发环境中收到范围服务解析错误?

问题描述

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


我有一个 .NET Core 3.1 控制台应用程序,它使用.NET 通用主机进行依赖注入。在其中,我有一个 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) as对此进行测试Production,这是默认设置。一切正常。

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

一旦我这样做了,我就收到了以下异常:

System.InvalidOperationException:'无法从根提供程序解析范围服务'MyNamespace.Data.BotDbContext'。'

为什么这个异常只在环境存在时才会发生Development,而不是Production

标签: c#.net-coredependency-injection

解决方案


您已使用CreateDefaultBuilder. 仔细查看文档,我们可以看到默认配置项之一:

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

我们还可以在源代码中看到它仅在开发环境中设置ValidateScopes在 ServiceProvider 上。

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


推荐阅读