Automapper Composite DTO到ViewModel的转换

时间:2012-04-30 20:09:33

标签: c# automapper

在某些情况下,需要从我们的存储库返回复合DTO,其中DTO只有一些属性是Model属性,而DTO的功能只是一个简单的复合对象(返回一个Queryable不是因为有比T更多的信息

例如:

型号:

public class Job
{
    int Id { get; set; }
    //more properties
}

public class JobApplication
{
    int Id { get; set; }
    //more properties
}

存储库:     IQueryable<JobAndUserApplication> GetJobAndMatchingUserApplication(int userId)

public class JobAndUserApplication
{
    public Job Job { get; set; }
    public JobApplication JobApplication { get; set; }
}

现在 - 我喜欢简单地做(Project和To是Automapper功能):

//this allows one efficient query to bring in the subproperties of the composite DTO    
var jobVmList = jobRepository.GetAllJobsAndMatchingJobApplicationByUser(userId)              
                             .Project()
                             .To<JobVM>()
                             .ToList();

所以我需要这样的映射:

Mapper.CreateMap<JobAndUserApplication, JobVM>()
      .ForMember(jvm => jvm, opt => opt.ResolveUsing(src => src.Job));
      //many other .ForMembers that are not relevant right now

我正在尝试将DTO的Job属性直接映射到JobVM(它共享许多相同的属性)。

我的映射会引发以下异常:

成员的自定义配置仅支持某种类型的顶级个人成员。

我做错了什么,如何在JobVM本身上完成DTO的Job属性的映射?

由于

1 个答案:

答案 0 :(得分:1)

Automapper告诉您,您只能在类的成员(属性)上定义自定义操作,而不能在类本身上定义。您需要做的是首先创建Job to JobVM地图:

Mapper.CreateMap<Job, JobVM>()

Mapper.CreateMap<JobAndUserApplication, JobVM>()

确保忽略并设置两种类型的任何重复属性。然后首先从子对象运行两次automapper:

var jobVM = Mapper.Map<Job, JobVM>(jobAndUserApplication.job);

然后从父对象

Mapper.Map<JobAndUserApplication, JobVM>(jobAndUserApplication, jobVM );

或者相反,取决于您的属性的布局方式。

快速注意:我有一种感觉,你可能会混淆问题,我的代码味道警报正在消失。我将再次查看您的viewmodel或域模型,因为这不是我看到的典型问题。 (只是我的0.02美元: - )