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

