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

.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 02:28:27