.NET 8依赖注入:如何添加同一服务类的多个实例
.NET 8依赖注入中创建同一HostedService类的多个实例
你遇到的问题核心原因是:泛型版本的AddHostedService<Worker>内部使用TryAddEnumerable逻辑注册服务——当多次注册同一实现类型(Worker)的IHostedService时,只有第一次注册会被容器保留,后续注册会被跳过,最终仅第一个实例执行。
解决方法:使用非泛型AddHostedService方法
直接调用非泛型版本的AddHostedService,传入实例工厂即可。该方法会每次向DI容器添加独立的IHostedService实例,不会出现覆盖或跳过的情况。
修改后的program.cs代码如下:
using PruebaWorkerService1; var builder = Host.CreateApplicationBuilder(args); // 移除泛型参数<Worker>,使用非泛型AddHostedService方法 builder.Services.AddHostedService(x => new Worker("worker1")); builder.Services.AddHostedService(x => new Worker("worker2")); builder.Services.AddHostedService(x => new Worker("worker3")); var host = builder.Build(); host.Run();
备选方案:创建派生类注册(适用于需区分服务类型的场景)
如果需要通过服务类型单独管理每个实例,可以为Worker创建多个派生类,再分别注册:
// 新增派生类 namespace PruebaWorkerService1; public class Worker1 : Worker { public Worker1() : base("worker1") { } } public class Worker2 : Worker { public Worker2() : base("worker2") { } } public class Worker3 : Worker { public Worker3() : base("worker3") { } }
注册时使用泛型方法:
using PruebaWorkerService1; var builder = Host.CreateApplicationBuilder(args); builder.Services.AddHostedService<Worker1>(); builder.Services.AddHostedService<Worker2>(); builder.Services.AddHostedService<Worker3>(); var host = builder.Build(); host.Run();
内容的提问来源于stack exchange,提问作者mariano desivo
相关产品推荐
相关产品推荐

