Car*_*ers 5 c# mapping projection automapper
我在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);
Run Code Online (Sandbox Code Playgroud)
在我的项目中,我将序列化使用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)));
//...
Run Code Online (Sandbox Code Playgroud)
该代码段的视图模型如下所示:
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
{
//...
}
Run Code Online (Sandbox Code Playgroud)
这是正确的吗?我应该从viewmodel投影每个成员并使用投影手动映射吗?或者有更清洁的方法吗?