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
并具有正确的结果,但调试器的下一步再次运行映射并混淆已经映射的对象。
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>
映射应该负责实际的属性映射。