วิธีระบุกฎการแมปเมื่อชื่อของคุณสมบัติแตกต่างกัน


144

ฉันเป็นมือใหม่ในกรอบ Automapper ฉันมีคลาสโดเมนและคลาส DTO ดังนี้:

public class Employee
{
   public long Id {get;set;}
   public string Name {get;set;}
   public string Phone {get;set;}
   public string Fax {get;set;}
   public DateTime DateOfBirth {get;set;}
}

public class EmployeeDto
{
   public long Id {get;set;}
   public string FullName {get;set;}
   public DateTime DateOfBirth {get;set;}
}

หมายเหตุ: ชื่อของคุณสมบัติ " ชื่อ " ของEmployeeคลาสไม่เหมือนกับชื่อของคุณสมบัติ " FullName " ของEmployeeDtoคลาส

และนี่คือรหัสเพื่อแมปEmployeeวัตถุกับEmployeeDto:

Mapper.CreateMap<Employee, EmployeeDto>(); // code line (***)
EmployeeDto dto = Mapper.Map<Employee, EmployeeDto>(employee); 

คำถามของฉันคือ: ถ้าฉันต้องการแมปEmployee(คลาสต้นทาง) ถึงEmployeeDto(คลาสปลายทาง) ฉันจะระบุกฎการแมปได้อย่างไร กล่าวอีกนัยหนึ่งฉันควรทำอย่างไรกับโค้ดบรรทัด (***) ด้านบนมากขึ้น

คำตอบ:


292

ไม่เป็นไรตัวฉันเองก็พบทางออก:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));

1
มีวิธีระบุทั่วโลกสำหรับคลาสใด ๆ เช่นคำนำหน้า / คำต่อท้ายหรือไม่ ตัวอย่างเช่นฉันมีกลุ่มคลาสที่มีไลบรารีซึ่งมีคุณสมบัติ "การโลคัลไลซ์" ในแต่ละรายการ และฉันต้องการแมปไปยังคลาสที่มีคุณสมบัติที่สอดคล้องกันเรียกว่า "LocalizedName" ตัวเลือกเดียวของฉันคือการเพิ่ม ForMember ให้กับการกำหนดค่าการจับคู่แต่ละครั้งหรือไม่
NickAb

2
ไม่มีเมธอด CreateMap ในคลาส Mapper :(
Navid_pdp11

3
@ Navid_pdp11 ใช่มี คุณต้องมี Mapper ชั้นคงที่ไม่ใช่ตัวอย่าง
Jordy van Eijk

@JordyvanEijk คุณใช้เวอร์ชันใดที่มีเมธอด "CreateMap" แบบคงที่? ใน 5.1.1.0 ไม่มีสิ่งนั้น
Matt Thomas

6
@ MattThomas หลังจากดู github ของ automapper ฉันเห็นว่าเป็นรุ่น 5.0 CreateMap ล้าสมัยและพวกเขาบอกว่าคุณต้องใช้ MapperConfiguration หรือ Mapper.Initialize
Jordy van Eijk

7

เพียงแสดงความคิดเห็นข้างต้นเป็นวิธีการอัปเดตโดยใช้ Automapper 8.1 + ...

var mapConfig = new MapperConfiguration(
   cfg => cfg.CreateMap<Employee, EmployeeDto>()
      .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name))
);

จากนั้นคุณจะสร้าง mapper โดยใช้ mapConfig:

var mapper = mapConfig.CreateMapper();

2

นอกจากนี้เรายังสามารถระบุคุณลักษณะคลาสสำหรับการแมป

จากhttps://docs.automapper.org/en/stable/Conventions.html#attribute-support

การสนับสนุนคุณสมบัติ

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * ปัจจุบันเปิดอยู่เสมอ

ค้นหาอินสแตนซ์ของ SourceToDestinationMapperAttribute สำหรับคุณสมบัติ / ฟิลด์และเรียกใช้ฟังก์ชัน isMatch ที่ผู้ใช้กำหนดเพื่อค้นหาสมาชิกที่ตรงกัน

MapToAttribute เป็นหนึ่งในนั้นซึ่งจะตรงกับคุณสมบัติตามชื่อที่ให้ไว้

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}

เมื่ออ้างอิงเนื้อหาจากที่อื่นทุกคำให้แน่ใจว่าได้ใช้การจัดรูปแบบบล็อกอ้างเพื่อให้ชัดเจนกับผู้อ่านว่าเนื้อหาจะถูกคัดลอก
TylerH

ตรวจสอบรูปแบบใหม่ :) docs.automapper.org/en/latest/Attribute-mapping.html
Lucian

ใหม่มากสำหรับ stackoverflow แน่นอนจะปฏิบัติตามกฎ @TylerH
Pranay DevOps
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.