Jak określić regułę odwzorowania, gdy nazwy właściwości się różnią

144

Jestem nowicjuszem we frameworku Automapper. Mam następującą klasę domeny i klasę 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;}
}

Uwaga: nazwa właściwości „ NazwaEmployeeklasy różni się od nazwy właściwości „ FullNameEmployeeDtoklasy.

A oto kod do mapowania Employeeobiektu na EmployeeDto:

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

Moje pytanie brzmi: jeśli chcę mapować Employee(klasę źródłową) na EmployeeDto(klasę docelową), jak mogę określić regułę mapowania? Innymi słowy, jak mam zrobić więcej z linią kodu (***) powyżej?

Thomas.Benz
źródło

Odpowiedzi:

292

Nieważne, sam znalazłem rozwiązanie:

Mapper.CreateMap<Employee, EmployeeDto>()
    .ForMember(dest => dest.FullName, opt => opt.MapFrom(src => src.Name));
Thomas.Benz
źródło
1
Czy istnieje sposób, aby określić to globalnie dla dowolnej klasy, coś w rodzaju prefiksu / sufiksu? Na przykład mam kilka klas z biblioteki, z których każda ma właściwość „Lokalizacje”. Chcę je zmapować do klas, w których odpowiadająca im właściwość nazywa się „LocalizedName”. Czy moją jedyną opcją jest dodanie ForMember do każdej konfiguracji mapowania?
NickAb
2
nie ma metody CreateMap w klasie Mapper :(
Navid_pdp11
3
@ Navid_pdp11 tak, jest. Musisz mieć statyczną klasę Mapper, a nie instancję
Jordy van Eijk
@JordyvanEijk Której wersji używasz, która ma statyczną metodę „CreateMap”? W 5.1.1.0 nie ma czegoś takiego
Matt Thomas
6
@MattThomas Po przejrzeniu github automappera widzę, że od wersji 5.0 CreateMap jest przestarzały i mówią, że musisz użyć MapperConfiguration lub Mapper.Initialize.
Jordy van Eijk
7

Wystarczy zamieścić powyższe komentarze w zaktualizowanym podejściu przy użyciu Automapper 8.1 + ...

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

Następnie zbudowałbyś program mapujący przy użyciu mapConfig:

var mapper = mapConfig.CreateMapper();
ebol2000
źródło
2

Możemy również określić atrybuty klasy do mapowania

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

Obsługa atrybutów

AddMemberConfiguration().AddName<SourceToDestinationNameMapperAttributesMember>(); * Obecnie jest zawsze włączony

Wyszukuje wystąpienia SourceToDestinationMapperAttribute dla właściwości / pól i wywołuje zdefiniowaną przez użytkownika funkcję isMatch w celu znalezienia dopasowań składowych.

MapToAttribute jest jednym z nich, który dopasuje właściwość na podstawie podanej nazwy.

public class Foo
{
    [MapTo("SourceOfBar")]
    public int Bar { get; set; }
}
Pranay DevOps
źródło
Cytując dosłownie treść z innego miejsca, upewnij się, że używasz formatowania cytatów blokowych, aby czytelnicy mogli zrozumieć, że treść jest kopiowana.
TylerH
Sprawdź nowy styl :) docs.automapper.org/en/latest/Attribute-mapping.html
Lucian Bargaoanu
Bardzo nowość w stackoverflow. Na pewno będzie przestrzegać zasad @TylerH
Pranay DevOps