Come specificare la regola di mappatura quando i nomi delle proprietà differiscono


144

Sono un novizio del framework Automapper. Ho una classe di dominio e una classe DTO come segue:

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

Nota: il nome della proprietà " Nome " della Employeeclasse non è lo stesso di quello della proprietà " Nome completo " della EmployeeDtoclasse.

Ed ecco il codice per mappare l' Employeeoggetto a EmployeeDto:

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

La mia domanda è: se voglio mappare Employee(classe di origine) a EmployeeDto(classe di destinazione), come posso specificare la regola di mappatura? In altre parole, come devo fare di più con la riga di codice (***) sopra?

Risposte:


292

Non importa, io stesso ho trovato una soluzione:

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

1
C'è un modo per specificarlo globalmente per qualsiasi classe, qualcosa come prefisso / suffisso? Ad esempio, ho un gruppo di classi per una libreria che hanno proprietà "Localizzazioni" ciascuna. E voglio mapparli su classi in cui la proprietà corrispondente è chiamata "LocalizedName". La mia unica opzione è quella di aggiungere ForMember a ciascuna configurazione di mappatura?
NickAb,

2
non esiste un metodo CreateMap nella classe Mapper :(
Navid_pdp11

3
@ Navid_pdp11 sì, c'è. Devi avere la classe statica Mapper non un'istanza
Jordy van Eijk,

@JordyvanEijk Quale versione stai usando con un metodo "CreateMap" statico? In 5.1.1.0 non esiste nulla del genere
Matt Thomas,

6
@MattThomas Dopo aver dato un'occhiata al github di automapper, vedo che dalla versione 5.0 CreateMap è obsoleto e dicono che è necessario utilizzare MapperConfiguration o Mapper.Initialize.
Jordy van Eijk,

7

Solo per inserire i commenti sopra in un approccio aggiornato usando Automapper 8.1 + ...

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

Quindi dovresti creare il mapper usando mapConfig:

var mapper = mapConfig.CreateMapper();

2

Possiamo anche specificare gli attributi Class per il mapping

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

Supporto attributi

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * Attualmente è sempre attivo

Cerca istanze di SourceToDestinationMapperAttribute per Proprietà / Campi e chiama la funzione isMatch definita dall'utente per trovare le corrispondenze dei membri.

MapToAttribute è uno di questi che corrisponderà alla proprietà in base al nome fornito.

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

Quando si cita il contenuto da qualche altra parte alla lettera, assicurarsi di utilizzare la formattazione della citazione a blocchi per chiarire ai lettori che il contenuto viene copiato.
TylerH,


Molto nuovo su StackOverflow. Sicuramente seguirà le regole @TylerH
Pranay DevOps il
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.