如何全局配置AutoMapper 13,默认用下划线拆分复杂属性路径?
解决AutoMapper 13全局设置下划线命名约定不生效的问题
问题原因
你遇到的情况是因为AutoMapper 13中,每个Profile实例在构造时会默认将自身的DestinationMemberNamingConvention设为PascalCaseNamingConvention.Instance,这个实例级的设置优先级高于通过AddAutoMapper全局配置的规则,所以你之前的全局配置会被每个Profile的默认值覆盖。
可行解决方案
方案1:创建基类Profile批量统一设置
这是最省心的方案,只需要创建一个基类Profile,所有现有Profile继承它,一次性搞定所有配置:
- 新建一个基类:
using AutoMapper; using AutoMapper.Configuration.Conventions; public class BaseUnderscoreProfile : Profile { public BaseUnderscoreProfile() { DestinationMemberNamingConvention = LowerUnderscoreNamingConvention.Instance; } }
- 批量修改所有现有Profile的继承关系:
用IDE的全局替换功能(比如Visual Studio的Ctrl+Shift+H),将所有文件中的: Profile替换为: BaseUnderscoreProfile,500个文件几秒就能改完。
方案2:遍历所有Profile强制修改命名约定
如果不想修改现有Profile的继承关系,可以在AutoMapper配置阶段,遍历所有加载的Profile并强制设置命名约定:
services.AddAutoMapper((sp, cfg) => { // 先加载所有程序集内的Profile cfg.AddMaps(Assembly.GetExecutingAssembly()); // 遍历每个Profile,覆盖命名约定 foreach (var profile in cfg.Profiles) { profile.DestinationMemberNamingConvention = LowerUnderscoreNamingConvention.Instance; } }, Assembly.GetExecutingAssembly());
这个方案会在所有Profile加载完成后,逐个修改它们的实例配置,确保全局生效。
验证方法
调试时可以在配置完成后,检查任意Profile的DestinationMemberNamingConvention属性,应该已经变成LowerUnderscoreNamingConvention.Instance,此时下划线分隔的目标属性(如Account_Name)就能自动映射Account.Name了。
内容的提问来源于stack exchange,提问作者user24118918
相关产品推荐
相关产品推荐

