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?

Thomas.Benz
sumber

Jawaban:

292

Sudahlah, saya sendiri menemukan solusinya:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
Thomas.Benz
sumber
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();
ebol2000
sumber
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; }
}
Pranay DevOps
sumber
Saat mengutip konten dari tempat lain kata demi kata, pastikan untuk menggunakan pemformatan kutipan blok untuk memperjelas kepada pembaca bahwa konten tersebut disalin.
TylerH
Periksa gaya baru :) docs.automapper.org/en/latest/Attribute-mapping.html
Lucian Bargaoanu
Sangat baru di stackoverflow. Tentu akan mengikuti aturan @TylerH
Pranay DevOps