.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
相关产品推荐
相关产品推荐

