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

AutoMapper 10.1.1自定义转换器实例创建失败问题排查

AutoMapper 10.1.1自定义转换器实例创建失败问题排查与解决

问题原因

当仅调用builder.Services.AddAutoMapper(AutoMapperConfigurator.ConfigureAutoMapper)注册AutoMapper时,该方法仅会执行你定义的映射规则配置,但不会自动扫描程序集或注册自定义转换器到依赖注入(DI)容器。

AutoMapper使用ConvertUsing<TSourceConverter>()时,需要能获取到转换器的实例:

  • 如果转换器有无参构造函数,AutoMapper可以通过反射直接创建实例;
  • 如果转换器依赖其他服务(即有带参数的构造函数),则需要DI容器提供实例。

你遇到的报错Cannot create an instance of type ...SourceModelTypeConverter,本质是AutoMapper无法通过反射创建转换器实例(比如转换器没有无参构造函数),且DI容器中也没有注册该转换器类型。

而添加builder.Services.AddAutoMapper(Assembly.GetExecutingAssembly())后,AutoMapper会扫描指定程序集,自动将所有实现ITypeConverter接口的类型注册到DI容器,因此转换器实例能被正常获取,映射成功。

解决方案

方案1:给转换器添加无参构造函数(适用于无依赖的转换器)

如果你的转换器不需要依赖其他服务,直接为SourceModelTypeConverter和DestinationModelTypeConverter添加无参构造函数:

public class SourceModelTypeConverter : ITypeConverter<SourceModel, DestinationModel>
{
    public SourceModelTypeConverter() { }

    public DestinationModel Convert(SourceModel source, DestinationModel destination, ResolutionContext context)
    {
        // 你的转换逻辑
        return new DestinationModel { /* 赋值逻辑 */ };
    }
}

此时仅调用builder.Services.AddAutoMapper(AutoMapperConfigurator.ConfigureAutoMapper)即可正常运行,AutoMapper会通过反射直接创建转换器实例。

方案2:手动注册转换器到DI容器(适用于有依赖的转换器)

如果转换器需要依赖其他服务(比如构造函数注入了仓储、服务等),先将转换器注册到DI容器,再配置AutoMapper:

// 先注册自定义转换器
builder.Services.AddTransient<SourceModelTypeConverter>();
builder.Services.AddTransient<DestinationModelTypeConverter>();

// 再注册AutoMapper并传入配置方法
builder.Services.AddAutoMapper(AutoMapperConfigurator.ConfigureAutoMapper);

AutoMapper在需要转换器时,会从DI容器获取实例,解决创建失败的问题。

方案3:结合配置方法与程序集扫描(推荐)

如果你想兼顾自定义配置的简洁性和自动注册的便利性,可以同时传入配置方法和程序集:

builder.Services.AddAutoMapper(AutoMapperConfigurator.ConfigureAutoMapper, Assembly.GetExecutingAssembly());

该方法会同时执行你的自定义映射配置,以及扫描程序集自动注册所有ITypeConverter实现类,无需手动注册转换器。

内容的提问来源于stack exchange,提问作者daniel Kožul

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 06:13:37