.net7(.net core) 依赖注入:从 AddSingleton 注册的类里面访问 AddScoped 的问题
记录一下以免忘记。
今天从NopCommerce开源项目里面把它的任务调度类拆出来到我的项目用的时候,发现报错,报错信息如下
Some services are not able to be constructed (Error while validating the service descriptor 'ServiceType: OUC.Services.ScheduleTasks.ITaskScheduler Lifetime: Singleton ImplementationType: OUC.Services.ScheduleTasks.TaskScheduler': Cannot consume scoped service 'OUC.Services.ScheduleTasks.IScheduleTaskService' from singleton 'OUC.Services.ScheduleTasks.ITaskScheduler'.)
---> System.InvalidOperationException: Error while validating the service descriptor 'ServiceType: OUC.Services.ScheduleTasks.ITaskScheduler Lifetime: Singleton ImplementationType: OUC.Services.ScheduleTasks.TaskScheduler': Cannot consume scoped service 'OUC.Services.ScheduleTasks.IScheduleTaskService' from singleton 'OUC.Services.ScheduleTasks.ITaskScheduler'.
---> System.InvalidOperationException: Cannot consume scoped service 'OUC.Services.ScheduleTasks.IScheduleTaskService' from singleton 'OUC.Services.ScheduleTasks.ITaskScheduler'.
依赖注册的信息如下:
它在 TaskScheduler(单例注册)的构造函数中使用了 IScheduleTaskService ,而 IScheduleTaskService是用scoped注册的,我把这些代码拆到我的项目后,编译后运行竟然直接报错了,而它的却没有。
后来发现它默认用的是autofac,而我用的是.net core的依赖注入,然后github上有人对autofac这个bug进行了报告 https://github.com/autofac/Autofac.Extensions.DependencyInjection/issues/106
简单来说就是:autofac认为从单例的类访问scoped的类没问题,而.net core自带的依赖注入却不行
回到NopCommerce,它默认用的是autofac,而我项目没用,用的是.net core默认的。所以就报错了