AutoMapper: ForMember 和 ForSourceMember 有什么区别?

16

我刚开始使用AutoMapper,所以这可能是一个初学者的问题。我已经搜索过了,但没有看到这个被讨论过。在创建映射时,ForMember和ForSourceMember方法有什么区别:

            Mapper.CreateMap<Role, RoleDto>()
            .ForMember(x => x.Users, opt => opt.Ignore())
            .ForSourceMember(x => x.Users, opt => opt.Ignore());

我正在维护他人编写的代码。在某些地方,我看到了 ForMember,在其他地方看到了 ForSourceMember,并且如上所示,在某个地方同时出现了两者。

这两者之间有什么区别?

非常感谢您提供的任何帮助。

1个回答

16

查看方法签名。 在第一个函数中,参数的类型是整数和字符串,返回值是整数。 在第二个函数中,参数的类型是两个字符串,返回值是字符串。

Mapper.CreateMap<Role, RoleDto>()
           .ForMember(x => x.Users, opt => opt.Ignore())
           .ForSourceMember(x => x.Users, opt => opt.Ignore());

... ForMember 是一个期望名为 destinationMemberExpression<Func<RoleDto>> 参数的方法,而 ForSourceMember 则期望一个名为 sourceMemberExpression<Func<Role>> 参数。所以

  • ForMember 配置目标类型的成员。
  • ForSourceMember 配置源类型的成员。

在你的情况下,源类型和目标类型都有一个叫做 UserId 的成员,所以这两个调用看起来是一样的,但实际上并不一样。它们应该执行相同的操作,但有趣的是,ForSourceMember 看起来没有任何忽略成员的效果。也许这是一个 bug。


谢谢Gert。那帮助我理解了AutoMapper的工作原理。 - WindsorRick
1
我不同意“对于 ForSourceMember,似乎没有忽略成员的效果”这个评论。我认为当您将 MemberList.Source 设置为验证选项时,它确实会起作用(术语可能有些不确定,希望您能理解)。 - Zoop
1
@Zoop 你错了,它在这种情况下也会映射数据。它显然被用于“反向映射”。 - Peter Morris

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接