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

C# Worker类继承依赖注入报错:无法解析System.String服务

问题原因

报错核心是依赖注入(DI)容器无法自动解析string类型的服务。你的CustomerWorker构造函数要求传入两个参数:CustomerController和string ListenQueueName,其中CustomerController已经通过AddSingleton<CustomerController>()注册到DI容器了,但string是通用类型,DI不知道你要传入哪个具体字符串,所以激活CustomerWorker时失败。

解决方案

方案1:简化构造函数(推荐)

既然你已经在CustomerWorker里把ListenQueueName固定为"customers",完全没必要把它作为构造函数参数,直接在调用父类构造时传入固定值即可:

修改CustomerWorker代码:

public class CustomerWorker : SharedModelLibrary.Worker
{
    private readonly CustomerController _customerController;

    public CustomerWorker(CustomerController customerController)
        : base(customerController, "customers")
    {
        _customerController = customerController;
    }
}

然后Program.cs里的注册代码不用改,DI可以正常解析CustomerController并创建CustomerWorker实例。

方案2:用工厂方法注册服务(适用于需要动态传入字符串的场景)

如果后续需要根据不同场景传入不同的ListenQueueName,可以通过工厂委托告诉DI要传入的字符串值:

修改Program.cs的注册代码:

builder.Services.AddSingleton<ICustomerMessage, CustomerService>(); 
builder.Services.AddSingleton<CustomerController>();
builder.Services.AddHostedService(provider => 
{
    var controller = provider.GetRequiredService<CustomerController>();
    return new CustomerWorker(controller, "customers");
});

var app = builder.Build();

DI会通过你提供的工厂方法,先获取已注册的CustomerController,再传入指定的字符串来创建CustomerWorker。

额外优化建议
  1. 把CustomerWorker里的public CustomerController _customerController;改成private readonly CustomerController _customerController;,符合依赖注入的封装和不可变原则,避免外部随意修改。
  2. 去掉CustomerWorker里冗余的public readonly string ListenQueueName = "customers";,因为父类Worker已经定义了这个字段,子类无需重复定义(父类的是private,子类无法直接访问,但你已经通过构造函数把值传给父类了,子类自己的这个字段完全没用)。

内容的提问来源于stack exchange,提问作者SAP

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 07:15:59