You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法从根服务提供者解析Scoped服务,寻求DI测试解决方案

解决方案

你遇到的错误是因为单例服务(BackgroundService默认是单例)不能直接从根服务提供者解析Scoped服务——根容器没有绑定的作用域,而Scoped服务的生命周期是和作用域绑定的。

解决方法很简单,在ExecuteAsync方法中手动创建一个作用域,从作用域内获取Scoped服务:

修改TestBackgroundService的ExecuteAsync方法:

protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
    // 创建一个临时作用域
    using (var scope = ServiceProvider.CreateScope())
    {
        var builder = scope.ServiceProvider.GetRequiredService<IReportBuilderWorkerService>();
        await builder.RunAsync(1);
    }

    Environment.Exit(0);
}

为什么这样有效?

  • CreateScope()会创建一个新的服务作用域,Scoped服务会在这个作用域内被实例化,作用域结束时(using块结束),所有Scoped服务会被自动释放。
  • 不需要修改IReportBuilderWorkerService的生命周期(保持Scoped),避免因为改成Singleton带来的潜在问题(比如状态污染、依赖链冲突)。

这个方案完全适配你的临时测试需求,同时保留了DI的完整功能。

内容的提问来源于stack exchange,提问作者Jonathan Wood

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 15:57:20