6

我已经在 AutoMapper 的 GitHub 上阅读了这个示例,但该示例假设只有一种映射 InnerSource 的方法:

Mapper.CreateMap<OuterSource, OuterDest>();
Mapper.CreateMap<InnerSource, InnerDest>();
Mapper.AssertConfigurationIsValid();

var source = new OuterSource
    {
        Value = 5,
        Inner = new InnerSource {OtherValue = 15}
    };

var dest = Mapper.Map<OuterSource, OuterDest>(source);

在我的项目中,我正在序列化使用 EF 创建的具有循环引用的对象。这样做的原因是我需要从不同的“方向”到达对象。例如,如果我要求提供用户列表,我想查看他们关联的项目。如果我要求一个项目,我想查看与该项目关联的用户。

这些循环引用可以变得相当深,例如User.Role.Project.TaskTime.User,User.TaskTime.Project.Task.TaskType.VisibleToRole.Role.User等。

所以我需要嵌套映射相当深,它的完成方式取决于第一个映射是什么。

目前我正在做:

Mapper.CreateMap<User, UserFull>()
    .ForMember("TaskTimes", opt => opt.MapFrom(src => Mapper.Map<ICollection<TaskTime>, UserTaskTime>(src.TaskTimes)));
Mapper.CreateMap<TaskTime, UserTaskTime>()
    .ForMember("Task", opt => opt.MapFrom(src => Mapper.Map<Task, UserTaskTimeTask>(src.Task)));
//...

该片段的视图模型如下所示:

public class UserFull
{
    public string Email { get; set; }
    public string Name { get; set; }

    public virtual ICollection<TaskTime> TaskTimes { get; set; }
    //...
}

public class UserTaskTime
{
    public int Id { get; set; }
    public Task Task { get; set; }
    //...
}

public class UserTaskTimeTask
{
    //...
}

这是正确的吗?我应该从视图模型中投影每个成员并使用投影手动映射它吗?还是有更清洁的方法来做到这一点?

4

0 回答 0