0

在某些情况下,需要从我们的存储库中返回复合 DTO,其中 DTO 仅具有一些模型属性,并且 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 属性的映射?

谢谢

4

1 回答 1

1

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

Mapper.CreateMap<Job, JobVM>()

Mapper.CreateMap<JobAndUserApplication, JobVM>()

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

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

然后从父对象

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

或者反过来,取决于你的属性是如何布置的。

快速旁注:我感觉您可能会混淆问题,并且我的代码气味警报正在响起。我会再看一下您的视图模型或域模型,因为这不是我看到的典型问题。(只是我的 0.02 美元 :-)

于 2012-04-30T20:42:03.570 回答