应用中使用工厂方法模式时依赖注入抛出服务无法构造异常的问题
Hey,我看到你在用工厂方法模式结合依赖注入时遇到了服务解析的异常,咱们一步步来搞定这个问题:
问题核心原因
你抛出的异常本质是:Unable to resolve service for type 'CsvTransfer' while attempting to activate 'CsvTransferFactory'——简单说就是,你的CsvTransferFactory构造函数需要一个CsvTransfer实例,但DI容器里根本没注册这个类型,它找不到如何创建CsvTransfer,自然就没法构造工厂实例了。
快速修复方案
直接在Startup.cs的服务注册代码里,把CsvTransfer也添加到DI容器中:
services.AddTransient<IProductCategoryRepository, ProductCategoryRepository>(); services.AddTransient<CsvTransfer>(); // 新增这一行注册 services.AddTransient<CsvTransferFactory>();
这样DI容器就知道如何创建CsvTransfer实例,进而能顺利构造CsvTransferFactory了。
更符合工厂模式的优化写法
不过说实话,你当前的工厂写法有点偏离工厂方法模式的初衷——工厂本来是负责创建新对象的,结果你直接把CsvTransfer实例注入进来,工厂的意义就弱化了。我给你两种更合理的优化方向:
方向1:依赖IServiceProvider动态创建实例
让工厂依赖DI容器的IServiceProvider,每次需要创建ITransfer时从容器中获取新实例:
public class CsvTransferFactory:TransferFactory { private readonly IServiceProvider _serviceProvider; public CsvTransferFactory(IServiceProvider serviceProvider) { _serviceProvider = serviceProvider; } protected override ITransfer MakeTransfer() { // 每次调用都会创建一个全新的CsvTransfer实例 return _serviceProvider.GetRequiredService<CsvTransfer>(); } }
这种方式的好处是,CsvTransfer的依赖依然由DI容器管理,你不用手动处理它的构造参数。
方向2:直接注入工厂所需依赖,手动创建实例
如果不想依赖IServiceProvider,可以直接注入CsvTransfer的构造依赖,然后在工厂里手动实例化对象:
public class CsvTransferFactory:TransferFactory { private readonly IProductCategoryRepository _productCategoryRepo; public CsvTransferFactory(IProductCategoryRepository productCategoryRepo) { _productCategoryRepo = productCategoryRepo; } protected override ITransfer MakeTransfer() { return new CsvTransfer(_productCategoryRepo); } }
这种写法职责更清晰,工厂真正承担了“创建对象”的工作,而且不需要把CsvTransfer注册到DI容器中——因为工厂自己负责创建它。
总结
- 先添加
CsvTransfer的服务注册,快速解决当前的异常问题 - 建议优化工厂的实现方式,让它真正符合工厂方法模式的职责,而不是单纯依赖注入的实例
内容的提问来源于stack exchange,提问作者Ocelot

