Cara menentukan aturan pemetaan saat nama properti berbeda


144

Saya seorang pemula untuk kerangka kerja Automapper. Saya memiliki kelas domain dan kelas DTO sebagai berikut:

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

Catatan: Nama properti " Nama " Employeekelas tidak sama dengan properti "Nama lengkap " EmployeeDtokelas.

Dan ini kode untuk memetakan Employeeobjek EmployeeDto:

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

Pertanyaan saya adalah: Jika saya ingin memetakan Employee(kelas sumber) ke EmployeeDto(kelas tujuan), bagaimana saya bisa menentukan aturan pemetaan? Dengan kata lain, bagaimana saya harus berbuat lebih banyak dengan baris kode (***) di atas?

Jawaban:


292

Sudahlah, saya sendiri menemukan solusinya:

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

1
Apakah ada cara untuk menentukannya secara global untuk kelas apa saja, sesuatu seperti awalan / akhiran? Sebagai contoh, saya memiliki banyak kelas dari perpustakaan yang masing-masing memiliki properti "Lokalisasi". Dan saya ingin memetakannya ke kelas di mana properti terkait disebut "LocalizedName". Apakah satu-satunya pilihan saya adalah menambahkan ForMember ke setiap konfigurasi pemetaan?
NickAb

2
tidak ada metode CreateMap di kelas Mapper :(
Navid_pdp11

3
@ Navid_pdp11 ya ada. Anda harus memiliki Mapper kelas statis bukan sebuah instance
Jordy van Eijk

@JordyvanEijk Versi apa yang Anda gunakan yang memiliki metode "CreateMap" statis? Dalam 5.1.1.0 tidak ada hal seperti itu
Matt Thomas

6
@MattThomas Setelah melihat github automapper saya melihat bahwa pada versi 5.0 CreateMap sudah usang dan mereka mengatakan Anda perlu menggunakan MapperConfiguration atau Mapper.Initialize.
Jordy van Eijk

7

Hanya untuk menggulung komentar di atas ke dalam pendekatan yang diperbarui menggunakan Automapper 8.1 + ...

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

Maka Anda akan membangun mapper menggunakan mapConfig:

var mapper = mapConfig.CreateMapper();

2

Kita juga bisa menentukan atribut Class untuk pemetaan

Dari https://docs.automapper.org/en/stable/Conventions.html#attribute-support

Dukungan Atribut

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * Saat ini selalu aktif

Mencari contoh SourceToDestinationMapperAttribute for Properties / Fields dan memanggil fungsi isMatch yang ditentukan pengguna untuk menemukan kecocokan anggota.

MapToAttribute adalah salah satunya yang akan cocok dengan properti berdasarkan nama yang disediakan.

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

Saat mengutip konten dari tempat lain kata demi kata, pastikan untuk menggunakan pemformatan kutipan blok untuk memperjelas kepada pembaca bahwa konten tersebut disalin.
TylerH


Sangat baru di stackoverflow. Tentu akan mengikuti aturan @TylerH
Pranay DevOps
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.