我对自动映射器不太熟悉,但是我们的软件设计师为此项目抛出了它。
该概念是对波动率的完全封装。这是做工不好的图
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>();
答案 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()); //忽略属性的映射
请注意,在复杂映射之前定义基本映射,否则会遇到麻烦!
希望这会有所帮助。