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

.NET Core泛型依赖注入解析失败问题求助

问题分析
  • 构造函数依赖的是ITest<TestBase>,但你的基类实际是TestBaseConfigs,属于笔误,需修正为ITest<TestBaseConfigs>。
  • 泛型接口ITest<T>默认是不变类型,ITest<ChildDfx1Configs>和ITest<TestBaseConfigs>是完全独立的类型,无法直接互相赋值。因此即使注册了ITest<ChildDfx1Configs>,容器也无法解析ITest<TestBaseConfigs>。
  • 你尝试直接注册ITest<TestBaseConfigs>到Dfx1Calc,但Dfx1Calc实现的是ITest<ChildDfx1Configs>,类型不兼容,导致注册无效。
解决方案

1. 修正构造函数的泛型参数

将TranslationFeeManager的构造函数依赖改为正确的基类泛型:

public TranslationFeeManager(IChargesRepository chargesRepository, ITest<TestBaseConfigs> currencyConversionManager)
{
    _chargesRepository = chargesRepository;
    _currencyConversionManager = currencyConversionManager;
}

2. 让泛型接口支持协变

修改ITest<T>接口,添加out关键字声明协变(由于Calculate方法未使用T作为输入参数,完全满足协变条件):

public interface ITest<out T> where T : TestBaseConfigs
{
    void Calculate();
}

3. 正确注册依赖

现在可根据配置动态注册对应实现类,容器会自动处理协变类型的转换:

var currencyExchangeSettings = Configuration.GetSection("DfxCurrencyExchangeSettings");
var useDfx1CurrencyExchange = Convert.ToBoolean(currencyExchangeSettings["UseDfx1CurrencyExchange"]);

if (useDfx1CurrencyExchange)
{
    services.AddScoped<ITest<TestBaseConfigs>, Dfx1Calc>();
}
else
{
    services.AddScoped<ITest<TestBaseConfigs>, Dfx2Calc>();
}

4. 补充:修复实现类的方法访问修饰符

你的Dfx1Calc和Dfx2Calc中Calculate方法默认是私有,不符合接口实现要求,必须改为public:

public class Dfx1Calc : ITest<ChildDfx1Configs>
{
    public void Calculate()
    {
        // 业务逻辑实现
    }
}

public class Dfx2Calc : ITest<ChildDfx2Configs>
{
    public void Calculate()
    {
        // 业务逻辑实现
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 14:45:24