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.