我有一个奇怪的案例,我对 AutoMapper 还很陌生,我无法理解发生了什么。
我有两个类
public class Person
{
public List<Friend> Friends {get;set;}
}
public class PersonView : Person
{
public new List<FriendView> Friends {get;set;}
}
和 map
Mapper.CreateMap<Person, PersonView>().ForMember(d => d.Friends,
o => o.ResolveUsing<FriendViewResolver>().FromMember(s => s.Friends));
但是,我也有这张 map ,它有自己的映射:
Mapper.CreateMap<Friend, FriendView>().ForMember(/* a lot of stuff */);
现在,在 FriendViewResolver 内部 - 我正在调用 Mapper.Map<Friend, FriendView>()
为每一位 friend 。但由于某种原因,在运行后,一些属性会丢失,并且通过单步执行代码,AutoMapper 似乎对列表进行了第二次传递。
我想要FriendViewResolver
在列表上运行,因为它正在对 Friends
的整个集合执行递归操作。 ,但我不明白如果该成员有解析器规则,为什么 AM 会进行第二次传递。
我真的希望这是有道理的。
编辑:当我运行 Mapper.Map<Person, PersonView>();
时出现问题,我看到它运行 FriendViewResolver
并有正确的结果,但调试器的下一步再次运行映射并弄乱已经映射的对象。
最佳答案
PersonView 派生自 Person。这不是 AutoMapper 应该使用的方式。它应该用于不同类之间的映射。您在这里尝试做的似乎是您有一个域模型 Person 并且您正在尝试创建一个将在 View 中使用的 View 模型 PersonView 。这很好,而且正是您应该做的,只是 View 模型不应该从域模型派生。它是独立的。然后使用 AutoMapper 在它们之间进行映射。
所以你的 PersonView 类应该如下所示:
public class PersonView
{
public List<FriendView> Friends {get;set;}
}
现在您将有 2 个映射定义:
Mapper.CreateMap<Friend, FriendView>();
Mapper.CreateMap<Person, PersonView>();
当您拥有域模型 (Person) 的实例时,您将能够映射到 View 模型 (PersonView)。
关于c# - AutoMapper - 如何选择不执行 "inner"映射?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8467505/