AutoMapper และการแมปวัตถุแบบซ้อนสำหรับการห่อหุ้ม

ฉันไม่คุ้นเคยกับ automapper มากนัก แต่สถาปนิกซอฟต์แวร์ของเราโยนมันใส่ฉันสำหรับโปรเจ็กต์นี้

แนวคิดนี้คือการห่อหุ้มความผันผวนอย่างสมบูรณ์ นี่คือไดอะแกรมที่ทำไม่ดี

API/เลเยอร์การนำเสนอ | คำขอและการตอบสนองวัตถุต่อท้าย (เช่น ApplicationCreateRequest)


ชั้นธุรกิจ | หน้าแรกของออบเจ็กต์การโอนโดเมน ซึ่งต่อท้าย DTO (เช่น ApplicationCreateDTO)


ชั้นฐานข้อมูล | หน้าแรกของออบเจ็กต์การเข้าถึงทรัพยากรและเอนทิตีต่อท้าย RAO และเอนทิตี (เช่น ApplicationEntity, ApplicationCreateRAO)

ฉันต้องแปลง ApplicationCreateRequests เป็น ApplicationCreateDTO's รวมถึงแปลง Requests Nested object เป็น 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>(); 

person T. Deeter    schedule 09.11.2018    source แหล่งที่มา


คำตอบ (1)


วิธีง่ายๆ ในการแมปโมเดลที่ซับซ้อนคือการประกาศและแมปพวกมันจากที่ง่ายที่สุด (ด้วยประเภทเนทิฟ เช่น : strings, int,...) ไปจนถึงที่ซับซ้อน

ดังนั้น คุณควรสร้างการแมปอย่างง่ายสำหรับ ContactCreateRequest ไปยัง ContactCreateDTO ด้วย CreateMap (และอื่นๆ ที่ง่ายที่สุด) จากนั้นคุณจะต้องสร้างสิ่งที่ชอบ:

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()); // เพื่อละเว้นการแมปของคุณสมบัติ

หมายเหตุที่มีประโยชน์ กำหนดการแมปฐานก่อนที่ซับซ้อน ไม่เช่นนั้นคุณจะมีปัญหา!

หวังว่านี่จะช่วยได้

person Minus    schedule 09.11.2018