AutoMapper


Automapper

Der AutoMapper ist ein Package für .NET unter der MIT Lizenz. Sein Ziel ist es, das Mapping von Models zu ViewModels zu vereinfachen und wieder verwendbare Regeln für das Mapping festzulegen.

Warum AutoMapper?

Der AutoMapper wurde ursprünglich für ASP.NET MVC erstellt. Das Problem war, dass in MVC Projekten für jede Ansicht ein ViewModel existierte. Dies sind vereinfachte Klassen eines Models, um nur die benötigten Daten an die Ansicht zu geben. Dadurch häufte sich allerdings eine Menge von "Zuweisungscode", welcher unschön und anfällig für Null Reference Exceptions war.

Deshalb entwickelte Jimmy Bogard den AutoMapper. Damit konnte er die Null Reference Exceptions verhindern, Boilerplate Code entfernen und sicherstellen, dass immer alle Werte des ViewModels gesetzt waren.

Trotzdem steht der AutoMapper von vielen unter Kritik. Das Mapping sei anfällig für Laufzeitfehler und durch die "Magie" beim Mappen sei es schwer, die Fehler zu debuggen.

AutoMapper implementieren

Um den AutoMapper in einer .NET Applikation zu integrieren, muss zunächst das Package dafür installiert werden.

Der AutoMapper basiert auf sogenannten "Profiles". Darin wird definiert, welche Typen zu welchen Zieltypen umgewandelt werden können und wie sich das Mapping verhält. Standardmässig werden die Eigenschaften nach dem Namen gemapped, das heisst der AutoMapper erkennt, wenn es in beiden Klassen eine Eigenschaft mit demselben Namen hat. In diesem Beispiel habe ich ein Profile für das Mapping von "Person" zu "PersonViewModel" erstellt:


Während das Model "Person" viele Daten, wie die IP-Adresse oder das Passwort enthält, werden ins ViewModel nur die wichtigsten Daten für die View geladen. Die meisten Mappings dienen nur zur Illustration, denn es müsste eigentlich nur das Mapping für den FullName bestimmt werden, da die restlichen Eigenschaften durch die übereinstimmenden Namen automatisch gemapped werden würden. 

Um den AutoMapper zu verwenden, muss er nun noch im Program.cs registriert werden:

Nun kann der AutoMapper in einem Controller oder einer Razor Page injected und verwendet werden:

Weitere Funktionen

Neben der automatischen Erkennung von Eigenschaften mit dem gleichen Namen in den beiden Klassen, erkennt der AutoMapper auch Get-Methoden und mappt diese mit der Eigenschaft in der Zielklasse. Somit könnte man in der Person-Klasse beispielsweise die Methode "GetFullName()" implementieren. Der AutoMapper mappt dann den zurückgegebenen Wert der Methode mit dem "FullName" im PersonViewModel.

Eine weitere nützliche Funktion ist die automatische Erkennung von abgeflachten Hierarchien. Die Person-Klasse könnte somit eine Unterklasse "Address" enthalten, welche wiederum die Eigenschaft "PostalCode" enthält. Im ViewModel könnte dann die Eigenschaft "AddressPostalCode" erstellt und der Wert automatisch gemapped werden.

Falsche Verwendung des AutoMappers

Viele verwenden den AutoMapper für alle möglichen Umwandlungen von Typen. Dass der AutoMapper dafür geeignet ist, ist aber ein Missverständnis. Er wurde mit der Annahme konzipiert, dass es sich bei den Zieltypen um einfachere kompaktere Versionen der Ursprungstypen handelt, wie es bei ViewModels der Fall ist.

Ein weiterer Fehler ist das hinzufügen von Abhängigkeiten in einem Profile. Ein Profile sollte möglichst nur aus Linq bestehen und keine eigenen Services enthalten. Dies kann nämlich zu unerwartetem Verhalten und Fehlern führen. 

Fazit

Trotz der Kritik sehe ich den AutoMapper als nützliches Tool für das Mapping von ViewModels/DTOs. Dies ist aber auch der einzig sinnvolle Anwendungszweck. Bei komplizierten Mappings, empfehle ich eine manuelle Implementation, da der Code dadurch verständlicher und einfacher zu debuggen ist.

Kommentare

Beliebte Posts aus diesem Blog

QuestPDF

ASP.NET Core Identity

Custom JsonConverter mit System.Text.Json