AutoMapper和嵌套对象映射以进行封装

时间:2018-11-09 16:01:39

标签: c# .net mapping automapper core

我对自动映射器不太熟悉,但是我们的软件设计师为此项目抛出了它。

该概念是对波动率的完全封装。这是做工不好的图

API /表示层| 请求和响应后缀的对象。 (即ApplicationCreateRequest)


业务层| 域传输对象的主目录,后缀为DTO。 (即ApplicationCreateDTO)


数据库层| 资源访问的首页对象和实体后缀为RAO和实体(即ApplicationEntity,ApplicationCreateRAO)

我需要将ApplicationCreateRequests转换为ApplicationCreateDTO,并将请求嵌套对象也转换为DTO。

例如:

public class ApplicationCreateRequest
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public ContactCreateRequest Contact { get; set; }
    public DemographicCreateRequest Demographic { get; set; }
    public EducationCreateRequest Education { get; set; }
    public WorkCreateRequest Work { get; set; }
}

成为

public class ApplicationCreateDTO
{
    public string FirstName { get; set; }
    public string LastName { get; set; }

    public ContactCreateDTO Contact { get; set; }
    public DemographicCreateDTO Demographic { get; set; }
    public EducationCreateDTO Education { get; set; }
    public WorkCreateDTO Work { get; set; }
}

DTO和请求在大多数情况下具有相同的属性。

我只能使用非常基本的映射,例如:

CreateMap<ObjectOne, ObjectTwo>(); 

1 个答案:

答案 0 :(得分:0)

映射复杂模型的一种简单方法是声明,并将它们从最简单的(具有本地类型,例如:字符串,整数,...)映射到复杂的模型。

因此,您应该使用CreateMap(以及其他最简单的方法)为ContactCreateRequest创建简单的映射到ContactCreateDTO。然后,您将必须创建类似:

MapFrom允许您指定要映射的属性(如果命名不同,则为原因)。它还允许您从预定义的映射中指定结果,只需告诉它要从中映射的成员即可。

Mapper.CreateMap<ApplicationCreateRequest, ApplicationCreateDTO>()
    .ForMember(g => g.FirstName, opt => opt.MapFrom(src => src.FirstName));
    .ForMember(g => g.LastName, opt => opt.MapFrom(src => src.LastName));
    .ForMember(g => g.Contact, opt => opt.MapFrom(src => Mapper.Map<ContactCreateRequest,ContactCreateDTO>(g.Contact)));
    .ForMember(g => g.Demographic, opt => opt.MapFrom(src => Mapper.Map<DemographicCreateRequest,DemographicCreateDTO>(g.Demographic)));
    .ForMember(g => g.Education, opt => opt.MapFrom(src => Mapper.Map<EducationCreateRequest,EducationCreateDTO>(g.Education)));
    .ForMember(g => g.Work, opt => opt.MapFrom(src => Mapper.Map<WorkCreateRequest,WorkCreateDTO>(g.Work)));

您可以使用

  

.ForMember(g => g.Property,opt => opt.Ignore()); //忽略属性的映射

请注意,在复杂映射之前定义基本映射,否则会遇到麻烦!

希望这会有所帮助。