使用程序集扫描时如何访问.NET AutoMapper配置并应用全局忽略规则?
问题解答
能否在程序集扫描注册Profile时获取AutoMapper配置实例?
可以。在依赖注入模式下,你可以通过AddAutoMapper方法的重载参数访问IMapperConfigurationExpression实例完成全局配置;同时也能在自定义Profile类内部直接配置映射规则。
原有IgnoreUnmapped逻辑的DI模式适配方案
针对你实现的忽略未映射属性逻辑,提供两种适配方案:
方案1:基于自定义Profile基类实现全局生效
创建抽象基类Profile,在构造函数中调用IgnoreUnmapped扩展方法,所有业务Profile继承该基类即可自动应用规则:
public abstract class BaseProfile : Profile { protected BaseProfile() { this.IgnoreUnmapped(); } } // 业务Profile示例 public class UserProfile : BaseProfile { public UserProfile() { CreateMap<User, UserDto>(); // 其他映射规则... } }
程序集扫描时,所有继承BaseProfile的类都会自动启用忽略未映射属性的逻辑。
方案2:通过全局配置直接注入逻辑
扩展AutoMapperExtensions,新增针对IMapperConfigurationExpression的扩展方法,在注册AutoMapper时全局生效,无需修改现有Profile:
public static class AutoMapperExtensions { private static void IgnoreUnmappedProperties(TypeMap map, IMappingExpression expr) { foreach (string propName in map.GetUnmappedPropertyNames()) { if (map.SourceType.GetProperty(propName) != null) { expr.ForSourceMember(propName, opt => opt.Ignore()); } if (map.DestinationType.GetProperty(propName) != null) { expr.ForMember(propName, opt => opt.Ignore()); } } } // 保留原有的Profile扩展方法... public static void IgnoreUnmapped(this IMapperConfigurationExpression config) { config.ForAllMaps(IgnoreUnmappedProperties); } public static void IgnoreUnmapped(this IMapperConfigurationExpression config, Func<TypeMap, bool> filter) { config.ForAllMaps((map, expr) => { if (filter(map)) { IgnoreUnmappedProperties(map, expr); } }); } }
在DI注册时调用该扩展:
// ASP.NET Core示例 services.AddAutoMapper(config => { config.IgnoreUnmapped(); // 可添加过滤规则,比如仅针对特定类型 // config.IgnoreUnmapped(map => map.SourceType == typeof(User)); }, typeof(Startup).Assembly); // 传入要扫描的程序集
此方式会对所有扫描到的Profile中的映射规则统一应用忽略逻辑,无需修改现有Profile代码。
内容的提问来源于stack exchange,提问作者Josh Russo
相关产品推荐
相关产品推荐

