无法从根服务提供者解析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
相关产品推荐
相关产品推荐

