AutoMapper dan pemetaan objek bersarang untuk enkapsulasi

Saya tidak terlalu akrab dengan automapper, tapi itu diberikan kepada saya oleh Arsitek Perangkat Lunak kami untuk proyek ini.

Konsepnya adalah enkapsulasi volatilitas secara menyeluruh. Berikut Diagram yang dibuat dengan buruk

API/Lapisan Presentasi | Objek akhiran Permintaan dan Respons. (yaitu, ApplicationCreateRequest)


Lapisan Bisnis | Beranda objek transfer Domain, diberi akhiran DTO. (yaitu, ApplicationCreateDTO)


Lapisan Basis Data | Beranda Objek dan entitas Akses Sumber Daya yang diberi akhiran RAO dan Entitas (yaitu, ApplicationEntity, ApplicationCreateRAO)

Saya perlu mengonversi ApplicationCreateRequests ke ApplicationCreateDTO, serta mengonversi objek Bersarang Permintaan ke DTO juga.

Misalnya:

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; }
}

menjadi

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 dan Permintaan sebagian besar memiliki properti yang sama.

Saya baru mulai bekerja dengan pemetaan yang sangat mendasar seperti:

CreateMap<ObjectOne, ObjectTwo>(); 

person T. Deeter    schedule 09.11.2018    source sumber


Jawaban (1)


Cara mudah untuk memetakan model yang kompleks adalah dengan mendeklarasikan, dan memetakannya dari yang paling mudah (dengan tipe asli misalnya: string, int,...) hingga yang kompleks.

Jadi, Anda harus membuat pemetaan sederhana untuk ContactCreateRequest ke ContactCreateDTO dengan CreateMap (dan yang paling sederhana lainnya). Maka Anda harus membuat sesuatu seperti:

MapFrom memungkinkan Anda menentukan properti (alasannya adalah jika diberi nama berbeda) untuk dipetakan. Ini juga memungkinkan Anda untuk menentukan hasil dari pemetaan yang telah ditentukan sebelumnya, Anda cukup memberi tahu anggota yang ingin Anda Petakan...

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)));

Anda dapat membangunnya dengan menggunakan

.ForMember(g => g.Properti, opt => opt.Ignore()); // untuk mengabaikan pemetaan properti

Catatan praktis, tentukan pemetaan dasar sebelum pemetaan kompleks, jika tidak, Anda akan mendapat masalah!

Semoga ini membantu.

person Minus    schedule 09.11.2018