ASP.NET Core 2.0中如何将Simple Injector组件注入IHostedService
你遇到的问题核心在于ASP.NET Core宿主只会从自身DI容器中加载IHostedService实例,而你把TimedService注册到了ASP.NET Core容器,但它的依赖(比如IJobRepository)只存在于Simple Injector中,所以才会抛出Unable to resolve service for type 'IJobRepository'的错误。下面是解决这个问题的最佳实践:
1. 把IHostedService实现类注册到Simple Injector
首先,确保你的后台服务类(比如TimedService)注册在Simple Injector容器里,这样它才能正确解析到你在Simple Injector中配置的依赖(包括仓储、带装饰器的处理器等):
// 在Simple Injector容器配置中注册 container.Register<IHostedService, TimedService>(Lifestyle.Singleton);
注:IHostedService通常需要单例生命周期,所以这里用Lifestyle.Singleton。如果有多个后台服务,重复这个注册步骤即可。
2. 将Simple Injector中的IHostedService桥接到ASP.NET Core容器
ASP.NET Core的宿主只会从自身容器中获取IHostedService来启动,所以我们需要搭建一个桥接,让ASP.NET Core容器从Simple Injector中获取这些服务实例:
- 如果只有一个
IHostedService实现:
// 在ConfigureServices方法中添加 services.AddSingleton<IHostedService>(provider => container.GetInstance<IHostedService>());
- 如果有多个
IHostedService实现:
services.AddSingleton<IEnumerable<IHostedService>>(provider => container.GetAllInstances<IHostedService>());
3. 确保依赖项在Simple Injector中正确注册
你的IJobRepository和相关装饰器必须已经在Simple Injector中完成注册,比如:
container.Register<IJobRepository, SqlJobRepository>(Lifestyle.Scoped); // 注册装饰器(如果有的话) container.RegisterDecorator<IJobRepository, LoggingJobRepositoryDecorator>();
4. 验证自动启动效果
完成上述配置后,ASP.NET Core启动时会自动从自身容器中获取桥接过来的IHostedService实例(实际来自Simple Injector),同时这些实例的依赖注入会完全由Simple Injector处理,既解决了依赖解析错误,又保证了后台服务的自动启动。
关于集成包的说明
ASP.NET Core 2.0的Simple Injector基础集成包已经足够支持这种场景,不需要额外的独立集成包。只需要保证你已经正确完成了Simple Injector与ASP.NET Core的基础集成(比如设置Mvc控制器和视图组件的依赖解析)。
内容的提问来源于stack exchange,提问作者chrisbuttacavoli

