AutoMapper – mapowanie jednej klasy na drugą – wydajność i możliwości

Programując w ASP .NET MVC często mamy potrzebę zmapować jeden obiekt na inny, może to być np. encja pobrana z bazy danych, którą trzeba pozbawić niektórych właściwości i przekazać do dalszych warstw naszej aplikacji, lub – w prostszy ujęciu – konwersja modelu na View Model, którym napełnimy widok naszej aplikacji.

Można oczywiście robić to ręcznie, misternie przepisując każda właściwość, np. tak:

Ale jak mawiał jeden z moich profesorów – podstawową cechą informatyka jest lenistwo, a już programisty w szczególności! Dlatego powstało co najmniej kilka frameworków umożliwiających automatyczne mapowanie jednej klasy na inną.

Projektem obecnie najbardziej dynamicznie rozwijanym AutoMapper.

AutoMapper

Instalacja

Install-Package AutoMapper

Nie chce powielać – skądinąd bardzo dobrej dokumentacji, dlatego pokarzę tylko kilka przykładów oraz skupię się na zbadaniu jego wydajności.

Najprostsze użycie:

Istnieje również sporo dodatkowych możliwości, np.:

Zadania do wykonania przed i po mapowaniu obiektów:

Mapowanie warunkowe:

Sporo opcji związanych z konwencjami nazewniczymi i konwersją znaków.

Możemy przekazywać parametry do konstruktorów, jeśli nie wynikają one wprost z nazwy:

Można też konwertować typy:

A co z wydajnością?

Dla testu wykonałem prosta aplikację dostępna na moim GitHubie:

Najpierw tworzę sporo egzemplarzy klasy PersonEntity za pomocą biblioteki Bogus – opisanej w poprzednim artykule:

Następnie dokonuje mapowania na piechotę:

I mapowania za pomocą AutoMappera:

Wyniki:

Dla 200tys. obiektów:

Wynik mojego testu
Wynik testu dla 200k obiektów

Dla 1tys. obiektów:

WynikAutoMapper
Wynik testu dla 1k obiektów

Dla 500tys. obiektów:

Wynik mojego testu dla 500k obiektów
Wynik testu dla 500k obiektów

Podsumowanie:

AutoMapper jest ewidentnie wolniejszy od zwyczajnego mapowania jednej klasy na drugą, jest jednak szalenie wygodny w użyciu .

Zauważcie, że mapowane obiekty były dość proste, niestety w bardziej złożonych obiektach z większa ilością konwersji – narzut AutoMappera jest jeszcze bardziej widoczny.

W przypadku mapowania niewielkiej ilości obiektów, w sytuacji gdy większość pól posiada takie same nazwy (lub da się je przetłumaczyć wg jakiegoś klucza – np. poprzez dodanie prefixu) – użycie AutoMappera jest bardzo wygodne i przyspiesza istotnie development. Modyfikacja nazw pól czy logiki konwersji sprowadza się do zmiany tylko w jednym miejscu – gdzie przechowujemy konfigurację AutoMappera.

W sytuacjach gdzie mamy wiele złożonych elementów – ja raczej konwertowałbym obiekty na piechotę, ew. przedtem sprawdzając jak radzi sobie AutoMapper.

Jest też kilka sposobów optymalizacji (strojenia) AutoMappera, skupie się na nich w kolejnych artykułach! 🙂


Artykuł w ukazuje się w ramach projektu CyberHome tworzonego w ramach akcji DajSięPoznać.


2 przemyślenia nt. „AutoMapper – mapowanie jednej klasy na drugą – wydajność i możliwości

Dodaj komentarz

This site uses Akismet to reduce spam. Learn how your comment data is processed.