AutoMapper中使用带参数自定义值解析器报错的解决咨询
问题
使用AutoMapper实现Sourcingbundle与ResponsibleDto的映射时,将三个重复的IValueResolver合并为一个接收ResponsibleType枚举参数的ResponsiblePersonResolver,但在映射配置中实例化该解析器时,出现依赖注入无法解析ResponsibleType的错误。
错误原因
通过AddAutoMapper集成依赖注入时,AutoMapper会自动扫描程序集中所有IValueResolver实现,并将它们注册为Transient服务。此时在MapFrom中手动创建解析器实例时,AutoMapper会优先尝试从DI容器获取该解析器的实例,而DI容器无法解析枚举类型ResponsibleType(未被注册为服务),导致激活解析器失败。
解决方案
方法1:使用ResolveUsing指定手动实例化的解析器
将映射配置中的MapFrom替换为ResolveUsing,AutoMapper会直接使用你传入的解析器实例,不会触发DI容器的解析逻辑:
private class Mapping : Profile { public Mapping() { CreateMap<Sourcingbundle, ResponsibleDto>() .ForMember(dto => dto.BtvPurchasedPartPlanner, cfg => cfg.ResolveUsing(new ResponsiblePersonResolver(ResponsibleType.MM_PLAN))) .ForMember(dto => dto.BrManager, cfg => cfg.ResolveUsing(new ResponsiblePersonResolver(ResponsibleType.MM_MANAGE))) .ForMember(dto => dto.MgMstSpokesperson, cfg => cfg.ResolveUsing(new ResponsiblePersonResolver(ResponsibleType.MM_SPOKESMAN))); } }
方法2:通过Lambda表达式直接调用解析逻辑
如果不想修改方法名,可使用MapFrom的Lambda重载,手动创建解析器并调用Resolve方法:
private class Mapping : Profile { public Mapping() { CreateMap<Sourcingbundle, ResponsibleDto>() .ForMember(dto => dto.BtvPurchasedPartPlanner, cfg => cfg.MapFrom((source, dest, _, context) => new ResponsiblePersonResolver(ResponsibleType.MM_PLAN).Resolve(source, dest, null, context))) .ForMember(dto => dto.BrManager, cfg => cfg.MapFrom((source, dest, _, context) => new ResponsiblePersonResolver(ResponsibleType.MM_MANAGE).Resolve(source, dest, null, context))) .ForMember(dto => dto.MgMstSpokesperson, cfg => cfg.MapFrom((source, dest, _, context) => new ResponsiblePersonResolver(ResponsibleType.MM_SPOKESMAN).Resolve(source, dest, null, context))); } }
方法3:禁止AutoMapper自动注册该解析器(可选)
若希望保留MapFrom调用方式,可在注册AutoMapper时排除ResponsiblePersonResolver,避免它被注册到DI容器:
serviceCollection.AddAutoMapper( cfg => { cfg.DestinationMemberNamingConvention = new LowerUnderscoreNamingConvention(); }, // 排除目标解析器 types => types.Where(t => t != typeof(ResponsibleDto.ResponsiblePersonResolver)), Assembly.GetExecutingAssembly());
此方法相对繁琐,推荐优先使用前两种方案。
验证修改
修改完成后,AutoMapper将直接使用手动创建的解析器实例,不再触发DI容器对ResponsibleType的解析请求,错误即可解决。
内容的提问来源于stack exchange,提问作者Tarik Nukic
相关产品推荐
相关产品推荐

