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?

Odpowiedzi:


292

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

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

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();

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

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


Bardzo nowość w stackoverflow. Na pewno będzie przestrzegać zasad @TylerH
Pranay DevOps
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.