c# - 为什么我只会在开发环境中收到范围服务解析错误?
问题描述
我知道下面描述的错误的原因是我需要一个范围来实例化服务,这可以通过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
?
解决方案
您已使用CreateDefaultBuilder
. 仔细查看文档,我们可以看到默认配置项之一:
当 EnvironmentName 为“开发”时,在依赖注入容器上启用范围验证
我们还可以在源代码中看到它仅在开发环境中设置ValidateScopes
在 ServiceProvider 上。
使用此配置,在开发环境之外,配置的 ServiceProvider 将愉快地返回作用域上下文之外的作用域服务(尽管永远不应依赖这一点;这些服务的作用域是有原因的!)。
推荐阅读
- string - T-SQL - 列字符串
- javascript - 使用功能组件在 reactjs 中加载更多按钮
- python - 如何在 django 3 中正确发出信号?
- c++ - 如何创建有限数量的线程?
- javascript - 使用 JS 和 JQuery 制作幻灯片延迟图像循环
- python - 亚马逊价格跟踪器和推送通知
- php - PHP页面是空白的,没有错误,我该怎么办?
- reactjs - React middelware 代理没有转换 url
- javascript - 发布请求但收到错误此路由不支持 GET 方法。支持的方法:POST Laravel/Javascript
- swiftui - 删除图表填充