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

.NET Core中AutoMapper ITypeConverter注入泛型仓储失败如何解决

如何在ITypeConverter实现中注入泛型仓储

问题根因

运行时抛出依赖解析错误的核心原因有两个:

  • 未将泛型仓储的开放泛型实现注册到.NET Core依赖注入容器,容器无法根据转换器的泛型参数生成对应IRepository<T>实例
  • 映射配置中存在类名笔误:配置里引用的EntityConverter<State>和实际定义的转换器类CustomConverter<T>名称不匹配

修复步骤

1. 注册泛型仓储的开放泛型服务

在服务注册阶段(AddAutoMapper调用之前),添加泛型仓储的开放泛型注册,容器会在需要时自动生成对应实体类型的闭合仓储实例:

// 假设你的仓储实现类为Repository<T>,替换为你自己的实现类名即可
services.AddTransient(typeof(IRepository<>), typeof(Repository<>));

注意:仓储实现的泛型约束必须和转换器保持一致,即需要添加where T : MyEntity约束,否则会出现泛型参数不匹配的解析错误。

2. 修正映射配置的笔误

将映射配置中错误的转换器类名修正为你实际定义的CustomConverter<T>:

CreateMap<City, CityDto>(MemberList.None)
    .ReverseMap()
    .MapFrom(e => e.State, dto => dto.StateId)
    .ConvertUsing(typeof(CustomConverter<State>));

3. 确认现有注册逻辑正确性

你之前的两行注册代码无需修改,保持即可:

services.AddAutoMapper(cfg => 
{
    cfg.AddProfile<MyProfiles>();
});    
services.AddTransient(typeof(CustomConverter<>));

AutoMapper在检测到ConvertUsing传入的类型已经注册到DI容器时,会自动从容器解析实例,自动完成构造函数中IRepository<T>依赖的注入,不需要额外调用ConstructUsingService相关方法,完全符合Jimmy Bogard推荐的实现方式。

排错检查项

如果修复后仍抛出异常,逐一核对以下规则:

  • 不要在Profile配置中直接手动new转换器实例,必须通过ConvertUsing(Type)重载传入类型,否则会绕过DI容器的依赖注入流程
  • 确认IRepository<>和Repository<>的命名空间引用正确,不存在同名类型冲突
  • 确认泛型仓储的生命周期不短于转换器的生命周期(两者都注册为瞬态即可正常工作)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 20:48:16