AutoMapper -如何选择不执行"inner"地图

本文关键字:quot 执行 地图 inner 何选择 选择 AutoMapper | 更新日期: 2023-09-27 18:17:35

我有一个奇怪的情况,我对AutoMapper很陌生,我不明白发生了什么。

我有两个类

public class Person
{
    public List<Friend> Friends {get;set;}
}
public class PersonView : Person
{
    public new List<FriendView> Friends {get;set;}
}

和地图

Mapper.CreateMap<Person, PersonView>().ForMember(d => d.Friends,
    o => o.ResolveUsing<FriendViewResolver>().FromMember(s => s.Friends));

但是,我还有这个映射,它有自己的映射:

Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */);

现在,在FriendViewResolver中-我为每个朋友调用Mapper.Map<Friend, FriendView>()。但是由于某种原因,在它运行之后,一些属性丢失了,并且从步进代码中,看起来AutoMapper对列表进行了第二次传递。

我想让FriendViewResolver在列表上运行,因为它正在做递归的东西与Friends的整个集合,但我不明白为什么AM做第二次传递,如果有一个解析器规则的成员。

我真的希望这是有意义的。

编辑:当我运行Mapper.Map<Person, PersonView>();时发生问题,我看到它运行FriendViewResolver并具有正确的结果,但调试器的下一步再次运行映射并混淆已经映射的对象。

AutoMapper -如何选择不执行"inner"地图

PersonView派生自Person。这不是AutoMapper应该被使用的方式。它应该用于在不同的类之间进行映射。你在这里试图做的是,你有一个域模型Person,你试图创建一个视图模型PersonView,它将在视图中使用。这很好,而且正是您应该做的,除了视图模型不应该从域模型派生。它是独立的。然后使用AutoMapper在它们之间进行映射。

所以你的PersonView类应该是这样的:
public class PersonView
{
    public List<FriendView> Friends {get;set;}
}

,现在你将有两个映射定义:

Mapper.CreateMap<Friend, FriendView>();
Mapper.CreateMap<Person, PersonView>();

,当你有一个域模型(Person)的实例时,你将能够映射到视图模型(PersonView)。

我想你可以这样做:

Mapper.CreateMap<Person, PersonView>();
Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */);

<Person, PersonView>映射应该自动尝试映射Friends属性,因为它们具有相同的名称。<Friend, FriendView>映射应该负责实际的属性映射。