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

