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

应用中使用工厂方法模式时依赖注入抛出服务无法构造异常的问题

解决依赖注入中无法构造CsvTransferFactory的问题

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容器中——因为工厂自己负责创建它。

总结

  1. 先添加CsvTransfer的服务注册,快速解决当前的异常问题
  2. 建议优化工厂的实现方式,让它真正符合工厂方法模式的职责,而不是单纯依赖注入的实例

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 13:52:36