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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 21:36:22