AutoMapper结合DI与自定义类型转换器抛出AutoMapperMappingException问题
问题原因
你的MyItemTypeConverter是嵌套在Mappings类中的内部类,AutoMapper依赖的DI容器默认无法正确解析这类嵌套类型的实例。虽然你在映射配置中指定了转换器类型,但DI容器无法自动识别并实例化嵌套类,导致抛出Cannot create an instance of type MyTypeConverter异常。
AutoMapper文档中提到的“仅提供类型即可实例化”,前提是该类型是DI容器能够直接发现、访问的顶级类,嵌套类不在默认扫描和解析的范围内。
解决方案
方案1:将转换器改为顶级类(推荐)
把MyItemTypeConverter从Mappings类中移出,改为独立的顶级类,确保访问修饰符为public:
public class Mappings : MapperProfileProvider { public Mappings() { CreateMap<MyItemTypeA, MyItemTypeB>().ConvertUsing<MyItemTypeConverter>(); CreateMap<MyItemTypeB, MyItemTypeA>().ConvertUsing<MyItemTypeConverter>(); } } public class MyItemTypeConverter : ITypeConverter<MyItemTypeA, MyItemTypeB>, ITypeConverter<MyItemTypeB, MyItemTypeA> { public MyItemTypeB Convert(MyItemTypeA source, MyItemTypeB destination, ResolutionContext context) { return new MyItemTypeB() { // 赋值操作... }; } public MyItemTypeA Convert(MyItemTypeB source, MyItemTypeA destination, ResolutionContext context) { return new MyItemTypeA() { // 赋值操作... }; } }
这种方式符合AutoMapper的默认工作逻辑,无需额外注册,AddAutoMapper会自动扫描并处理该转换器。
方案2:保留嵌套结构并手动注册
如果一定要保留嵌套类结构,需要手动将转换器注册到DI容器中:
// 在Startup/Program.cs的DI配置中添加 services.AddScoped<Mappings.MyItemTypeConverter>();
或者在映射配置时直接传入转换器实例(适合转换器无依赖的场景):
public Mappings() { var converter = new MyItemTypeConverter(); CreateMap<MyItemTypeA, MyItemTypeB>().ConvertUsing(converter); CreateMap<MyItemTypeB, MyItemTypeA>().ConvertUsing(converter); }
内容的提问来源于stack exchange,提问作者Maddin
相关产品推荐
相关产品推荐

