O mnieBlogGitHub

AutoMapper - flatten

18 February, 2020 - 1 min read

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?

© 2020, Built with Gatsby