Od dawna wiedziałem, że AutoMapper ma bardzo wygodną - domyślną - funkcję, automatycznego rozpoznawania poprawnego mapowania między zagnieżdżonymi obiektami a ich spłaszczonymi wersjami. Przykładowo:
class Car
{
public string Vin {get;set;}
public string Model {get;set;}
public Person Owner {get;set;}
}
class Person
{
public string Id {get;set;}
public string FirstName {get;set;}
public string LastName {get;set;}
}Możemy bez problemu zmapować na spłaszczoną wersję:
class CarDto
{
public string Vin {get;set;}
public string Model {get;set;}
public string OwnerId {get;set;}
public string OwnerFirstName {get;set;}
public string OwnerLastName {get;set;}
}Wystarczy zdefiniować zwykłe mapowanie między typami Car i CarDto - AutoMapper sam rozpozna, że “podobiekt” Owner należy “spłaszyczyć” do właściwości z prefiksem Owner*:
configuration.CreateMap<Car, CarDto>();Co zrobić, gdy potrzebujemy wykonywać mapowanie w drugą stronę? To znaczy - mamy spłaszczony obiekt, a chcemy mapować do zagnieżdżonego obiektu (każdy przyzna, że lepsza jest taka struktura niż litania właściwości z takim samym prefiksem). Okazuje się, że to jest banalnie proste - wysatrczy przy definiowaniu mapowania dodać ReverseMap, tj.:
configuration.CreateMap<Car, CarDto>()
.ReverseMap();Co więcej, dodając specjalne metody typu ForMember czy ForPath możemy “customizować” tę odwrotną mapę - tak jakbyśmy konfigurowali zwykłe mapowanie.
Całkiem zgrabne, prawda?