c# - AutoMapper - 如何选择不执行 "inner"映射?

标签 c# asp.net-mvc asp.net-mvc-3 automapper

我有一个奇怪的案例,我对 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/

相关文章:

asp.net-mvc-3 - 向 Telerik MVC 网格发送附加数据

jquery - 将验证错误返回到 MVC 3 中的 jQuery 对话框

c# - vb.net代码USING和WITH的c#代码是什么

asp.net-mvc-3 - 对于这种情况如何进行路由映射

c# - LINQ 按特定列中每个唯一值的最高值排序

javascript - 如何使用 JavaScript 而不是提交按钮来发布 ASP.NET MVC Ajax 表单

asp.net-mvc - 如何使用razor View 引擎简洁地创建可选的HTML属性?

c# - 正则表达式,制作基本标题

c# - UseStatusCodePagesWithReExecute 不适用于禁止 (403)

c# - 如何在 vista 注册表中注册用 C# 编写的命名空间扩展