ASP.NET Core 5下AutoMapper如何为所有映射配置通用自定义类型转换器
全局类型转换器配置放置方案
你当前采用程序集扫描方式初始化AutoMapper时,不需要修改Startup.cs的注入逻辑。你之前看到的示例里的cfg本质是AutoMapper的配置表达式,和在Profile类构造函数中调用的CreateMap方法操作的是同一套全局配置,因此全局通用类型转换配置直接在被扫描到的Profile类中定义即可自动全局生效。
具体实现方式
1. 直接在现有业务Profile中添加配置
你已经创建的MappingProfile会被AppDomain.CurrentDomain.GetAssemblies()扫描加载,直接在它的构造函数中补充全局转换配置即可,示例改造如下:
public class MappingProfile : Profile { public MappingProfile() { // 原有业务对象映射保持不变 CreateMap<AttendeesAmazonBook, AttendeesAmazonBookDto>() .ForMember(dest => dest.BookPublishedDate, opt => opt.MapFrom(src => Convert.ToDateTime(src.BookPublishedDate)) ); // 直接添加全局通用类型转换,对所有映射场景生效 CreateMap<DateTime?, string>() .ConvertUsing<DateTimeToPlainStringConverter>(); // 如果存在字符串转日期的场景,也可以一并配置全局转换 CreateMap<string, DateTime?>() .ConvertUsing<StringToNullableDateTimeConverter>(); } }
配置生效后,所有属性类型为DateTime?、目标类型为string,或是源类型为string、目标类型为DateTime?的映射,都会自动应用对应的转换器,不需要在单个对象映射中重复编写转换逻辑。
2. (可选)单独拆分全局配置Profile
如果不想把通用配置和业务映射混写,可以单独新建一个专门承载全局配置的Profile类,只要它是公开的、继承自Profile,就会被自动扫描加载,完全不需要额外注册:
// 全局通用配置Profile,自动被扫描加载 public class GlobalCommonProfile : Profile { public GlobalCommonProfile() { // 所有跨业务通用的类型转换、全局约定配置都写在这里 CreateMap<DateTime?, string>().ConvertUsing<DateTimeToPlainStringConverter>(); CreateMap<string, DateTime?>().ConvertUsing<StringToNullableDateTimeConverter>(); } }
关键注意事项
- 全局转换配置生效后,你之前在单个
ForMember中重复写的日期类转换逻辑可以全部删除,AutoMapper会自动对所有同类型的属性应用全局转换规则。 - 你当前使用了
ProjectTo<>做EF Core投影查询,自定义转换器的逻辑需要兼容EF Core的查询翻译,否则会触发客户端求值,导致性能问题。如果转换逻辑无法被翻译成SQL,可以搭配ProjectTo的显式映射指定需要客户端处理的字段,避免全表数据拉取。 - 仅当你放弃程序集扫描、改为手动配置AutoMapper时,才需要把全局转换逻辑写到
AddAutoMapper的委托参数中,对应写法仅作参考:// 手动配置模式示例(你当前的扫描模式下不需要使用) services.AddAutoMapper(cfg => { cfg.CreateMap<DateTime?, string>().ConvertUsing<DateTimeToPlainStringConverter>(); cfg.AddProfile<MappingProfile>(); });
内容的提问来源于stack exchange,提问作者Peter Kellner
相关产品推荐
相关产品推荐

