AutoMapper使用目标实体带参构造函数时忽略ForMember配置的问题求助
AutoMapper使用目标实体带参构造函数时忽略ForMember配置的问题求助
大家好,我之前在GitHub上提交的相关issue被关闭了,所以来这里开帖求助。我认为这明显是AutoMapper的行为bug,因为它直接导致了意料之外的错误,所以最开始我是在GitHub提的issue而非在这里提问。
源/目标类型
public class ModelA { public string Text1 { get; set; } public string Text2 { get; set; } } public class ModelB { public string Text1 { get; set; } public ModelB() { } public ModelB(string text1) { Text1 = text1; } }
映射配置
public class ModelMappingProfile : Profile { public ModelMappingProfile() { CreateMap<ModelA, ModelB>() // 这是我用来修复问题的临时方案 //.ConstructUsing(_ => new ModelB()) .ForMember(x => x.Text1, map => map.MapFrom(src => src.Text2)); } }
使用版本
AutoMapper 12.0.1
实际行为
AutoMapper会选用最匹配的构造函数,完全忽略我配置的ForMember规则。因为我不是目标实体的所有者,没办法修改这个模型本身,目前唯一的临时解决办法是手动通过ConstructUsing指定使用无参构造函数,这样之后AutoMapper才会正确应用我的ForMember配置。
复现步骤
我做了一个简化的示例来复现问题,逻辑和我实际复杂场景一致:
- 按照上面的源/目标类型和映射配置编写代码
- 执行ModelA到ModelB的映射操作,会发现
ModelA.Text2并没有映射到ModelB.Text1,而是用了构造函数匹配的ModelA.Text1值
注:我实际的业务场景比这个示例复杂很多,只是用这个简单示例来描述问题本身,当然我并不是真的要做这类Text1和Text2的反向映射 😁
预期行为
我期望按照映射配置里的规则,把ModelA.Text2映射到ModelB.Text1。我觉得可以通过以下几种方案来修复这个问题:
- AutoMapper选用最匹配的构造函数,但同时应用我配置的
ForMember规则来赋值构造函数参数 - AutoMapper只使用无参构造函数,然后按照常规逻辑执行映射
- 至少AutoMapper可以抛出一个异常,提示我
ForMember配置因为构造函数映射被完全忽略了
个人觉得前两种方案更符合AutoMapper的"最佳实践"处理逻辑,不过我主要希望这个问题本身能被解决。
备注:内容来源于stack exchange,提问作者Dominik Pfeifer
相关产品推荐
相关产品推荐

