Ich bin relativ neu bei .NET und habe mich für .NET Core entschieden, anstatt die "alten Methoden" zu lernen. Ich habe hier einen ausführlichen Artikel zum Einrichten von AutoMapper für .NET Core gefunden. Gibt es jedoch eine einfachere Anleitung für Neulinge ?
c#
asp.net-core
automapper
theutz
quelle
quelle
Antworten:
Ich habe es herausgefunden! Hier sind die Details:
Fügen Sie Ihrer Lösung das AutoMapper Dependency Injection Package über NuGet hinzu .
Erstellen Sie eine neue Klasse für ein Zuordnungsprofil. (Ich habe eine Klasse im Hauptlösungsverzeichnis namens erstellt
MappingProfile.cs
und den folgenden Code hinzugefügt.) Ich verwende einUser
undUserDto
-Objekt als Beispiel.Fügen Sie dann die AutoMapperConfiguration
Startup.cs
wie folgt hinzu :Gehen Sie wie folgt vor, um das zugeordnete Objekt im Code aufzurufen:
Ich hoffe, dies hilft jemandem, neu mit ASP.NET Core zu beginnen! Ich freue mich über Feedback oder Kritik, da ich noch neu in der .NET-Welt bin!
quelle
Profile
Klassen angeordnet sindSchritt So verwenden Sie AutoMapper mit ASP.NET Core.
Schritt 1. Installieren von AutoMapper.Extensions.Microsoft.DependencyInjection aus dem NuGet-Paket.
Schritt 2. Erstellen Sie einen Ordner in Lösung, um Zuordnungen mit dem Namen "Zuordnungen" beizubehalten.
Schritt 3. Nach dem Hinzufügen des Mapping-Ordners haben wir eine Klasse mit dem Namen " MappingProfile " hinzugefügt. Dieser Name kann alles Einzigartige und Gute verstehen.
In dieser Klasse werden wir alle Zuordnungen pflegen.
Schritt 4. Initialisierung von Mapper beim Start "ConfigureServices"
In der Startklasse müssen wir das von uns erstellte Profil initialisieren und den AutoMapper-Dienst registrieren.
Code-Snippet, um die ConfigureServices-Methode anzuzeigen, bei der AutoMapper initialisiert und registriert werden muss.
Schritt 5. Ausgabe abrufen.
Um das zugeordnete Ergebnis zu erhalten, müssen wir AutoMapper.Mapper.Map aufrufen und das richtige Ziel und die richtige Quelle übergeben.
Code-Auszug
quelle
'Mapper' does not contain a definition for 'initialize'
. Ich benutzeAutoMapper.Extensions.Microsoft.DependencyInjection
Version 7.0.0Ich möchte die Antworten von @ theutz erweitern - nämlich diese Zeile:
Es gibt ( wahrscheinlich ) einen Fehler in AutoMapper.Extensions.Microsoft.DependencyInjection Version 3.2.0. (Ich verwende .NET Core 2.0)
Dies wird in dieser GitHub-Ausgabe behandelt. Wenn Ihre Klassen, die die Profilklasse von AutoMapper erben, außerhalb der Assembly existieren, in der sich Ihre Startup-Klasse befindet, werden sie wahrscheinlich nicht registriert, wenn Ihre AutoMapper-Injektion folgendermaßen aussieht:
es sei denn, Sie geben explizit an, nach welchen Assemblys AutoMapper-Profile durchsucht werden sollen.
Dies kann in Ihrem Startup.ConfigureServices folgendermaßen erfolgen:
Dabei verweisen "Assemblys" und "type_in_assemblies" auf die Assembly, in der Profilklassen in Ihrer Anwendung angegeben sind. Z.B:
Ich nehme an (und ich betone dieses Wort), dass aufgrund der folgenden Implementierung einer parameterlosen Überladung (Quellcode von GitHub ):
Wir verlassen uns darauf, dass CLR bereits eine JIT-Assembly hat, die AutoMapper-Profile enthält, die möglicherweise zutreffen oder nicht, da sie nur bei Bedarf angepasst werden (weitere Details in dieser StackOverflow-Frage).
quelle
Die Antwort von theutz hier ist sehr gut, ich möchte nur Folgendes hinzufügen:
Wenn Sie Ihr Mapping-Profil von
MapperConfigurationExpression
anstatt erben lassenProfile
, können Sie ganz einfach einen Test hinzufügen, um Ihr Mapping-Setup zu überprüfen. Dies ist immer praktisch:quelle
Ich habe es auf diese Weise gelöst (ähnlich wie oben, aber ich denke, es ist eine sauberere Lösung) für .NET Core 2.2 / Automapper 8.1.1 mit Extensions.DI 6.1.1.
Erstellen Sie die MappingProfile.cs-Klasse und füllen Sie den Konstruktor mit Maps (ich plane, eine einzelne Klasse zu verwenden, um alle meine Zuordnungen zu speichern).
Fügen Sie in Startup.cs unten hinzu, um DI hinzuzufügen (das Assembly-Argument bezieht sich auf die Klasse, die Ihre Mapping-Konfigurationen enthält, in meinem Fall auf die MappingProfile-Klasse).
Verwenden Sie es in Controller wie jedes andere DI-Objekt
quelle
MappingProfiles
mit,new Type[]{}
wie in dieser Antwort gezeigt , ist unnötig.In meiner Startup.cs (Core 2.2, Automapper 8.1.1)
In meinem Datenzugriffsprojekt
In meiner Modelldefinition
quelle
services.AddAutoMapper( typeof(DAL.MapperProfile) );
stattservices.AddAutoMapper(new Type[] { typeof(DAL.MapperProfile) });
?Ich mag viele Antworten, besonders die von @saineshwar. Ich verwende .net Core 3.0 mit AutoMapper 9.0, daher ist es an der Zeit, die Antwort zu aktualisieren.
Was für mich funktioniert hat, war in Startup.ConfigureServices (...), das den Dienst folgendermaßen registriert:
Ich denke, dass der Rest der @ Saineshwar-Antwort perfekt bleibt. Aber wenn jemand interessiert ist, ist mein Controller-Code:
Und meine Mapping-Klasse:
----- BEARBEITEN -----
Nachdem ich die Dokumente gelesen habe, die in den Kommentaren von Lucian Bargaoanu verlinkt sind, denke ich, dass es besser ist, diese Antwort ein wenig zu ändern.
Die parameterlos
services.AddAutoMapper()
(mit der Antwort @saineshwar) funktioniert nicht mehr (zumindest für mich). Wenn Sie jedoch die NuGet-Assembly AutoMapper.Extensions.Microsoft.DependencyInjection verwenden, kann das Framework alle Klassen überprüfen, die AutoMapper.Profile erweitern (wie meine, MappingProfile).In meinem Fall, in dem die Klasse zu derselben ausführenden Assembly gehört, kann die Dienstregistrierung auf verkürzt werden
services.AddAutoMapper(System.Reflection.Assembly.GetExecutingAssembly());
(Ein eleganterer Ansatz könnte eine parameterlose Erweiterung mit dieser Codierung sein).
Danke, Lucian!
quelle
Ich verwende AutoMapper 6.1.1 und asp.net Core 1.1.2.
Definieren Sie zunächst Profilklassen, die von der Profilklasse von Automapper geerbt wurden. Ich habe eine leere IProfile-Schnittstelle erstellt. Der Zweck besteht nur darin, die Klassen dieses Typs zu finden.
Erstellen Sie nun eine separate Klasse, z. B. Zuordnungen
Rufen Sie jetzt im MVC Core-Webprojekt in der Datei Startup.cs im Konstruktor die Mapping-Klasse auf, die alle Zuordnungen zum Zeitpunkt des Ladens der Anwendung initialisiert.
quelle
Wenn Sie für ASP.NET Core (getestet mit 2.0+ und 3.0) lieber die Quelldokumentation lesen möchten: https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection/blob/master/README.md
Andernfalls funktionieren die folgenden 4 Schritte:
Installieren Sie AutoMapper.Extensions.Microsoft.DependancyInjection von Nuget.
Fügen Sie einfach einige Profilklassen hinzu.
Fügen Sie dann unten Ihre Startup.cs-Klasse hinzu.
services.AddAutoMapper(OneOfYourProfileClassNamesHere)
Dann injizieren Sie einfach IMapper in Ihre Controller oder wo immer Sie ihn brauchen:
Und wenn Sie ProjectTo jetzt verwenden möchten, ist es einfach:
quelle
Für AutoMapper 9.0.0:
MapperProfile:
In Ihrem Startup:
In Controller oder Service: Inject Mapper:
Verwendung:
quelle
In den neuesten Versionen von asp.net core sollten Sie die folgende Initialisierung verwenden:
quelle
Asp.Net Core 2.2 mit AutoMapper.Extensions.Microsoft.DependencyInjection.
In Startup.cs
quelle
Hinzufügen zu dem, was Arve Systad zum Testen erwähnt hat. Wenn Sie aus irgendeinem Grund wie ich sind und die in der Zutz-Lösung bereitgestellte Vererbungsstruktur beibehalten möchten, können Sie die MapperConfiguration folgendermaßen einrichten:
Ich habe das in NUnit gemacht.
quelle
services.AddAutoMapper (); hat bei mir nicht funktioniert. (Ich verwende Asp.Net Core 2.0)
Nach der Konfiguration wie unten
Mapper initialisieren IMapper mapper = config.CreateMapper ();
und fügen Sie das Mapper-Objekt als Singleton-Dienste zu Diensten hinzu.AddSingleton (Mapper);
Auf diese Weise kann ich dem Controller einen DI hinzufügen
und ich habe wie folgt in meinen Aktionsmethoden verwendet
quelle
Über die Antwort von theutz muss der IMapper-Mapper- Parrameter nicht im Controller-Konstruktor angegeben werden.
Sie können den Mapper verwenden, da er an jeder Stelle des Codes ein statisches Element ist.
quelle
IMapper
Sie das verspotten und zum Beispiel einfach null zurückgeben, wenn es für den gegebenen Test irrelevant ist.