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。
额外优化建议
- 把
CustomerWorker里的public CustomerController _customerController;改成private readonly CustomerController _customerController;,符合依赖注入的封装和不可变原则,避免外部随意修改。 - 去掉
CustomerWorker里冗余的public readonly string ListenQueueName = "customers";,因为父类Worker已经定义了这个字段,子类无需重复定义(父类的是private,子类无法直接访问,但你已经通过构造函数把值传给父类了,子类自己的这个字段完全没用)。
内容的提问来源于stack exchange,提问作者SAP
相关产品推荐
相关产品推荐

