Jestem stosunkowo nowy w .NET i postanowiłem zająć się .NET Core zamiast uczyć się „starych sposobów”. Znalazłem tutaj szczegółowy artykuł na temat konfigurowania AutoMapper dla .NET Core , ale czy dla początkującego jest prostszy przewodnik?
c#
asp.net-core
automapper
theutz
źródło
źródło
Odpowiedzi:
Rozgryzłem to! Oto szczegóły:
Dodaj pakiet AutoMapper Dependency Injection do swojego rozwiązania za pośrednictwem NuGet .
Utwórz nową klasę dla profilu mapowania. (Utworzyłem klasę w głównym katalogu rozwiązań o nazwie
MappingProfile.cs
i dodałem następujący kod.) Jako przykładu użyję obiektuUser
iUserDto
.Następnie dodaj AutoMapperConfiguration w
Startup.cs
sposób pokazany poniżej:Aby wywołać odwzorowany obiekt w kodzie, wykonaj następujące czynności:
Mam nadzieję, że to pomoże komuś zacząć od nowa z ASP.NET Core! Czekam na wszelkie uwagi i uwagi, ponieważ wciąż jestem nowy w świecie .NET!
źródło
Profile
zlokalizowane są klasyKrok Aby użyć AutoMapper z ASP.NET Core.
Krok 1. Instalowanie AutoMapper.Extensions.Microsoft.DependencyInjection z pakietu NuGet.
Krok 2. Utwórz folder w rozwiązaniu, aby zachować mapowania o nazwie „Mapowania”.
Krok 3. Po dodaniu folderu Mapping dodaliśmy klasę o nazwie „ MappingProfile ”. Ta nazwa może być czymś wyjątkowym i dobrym do zrozumienia.
W tej klasie zamierzamy zachować wszystkie mapowania.
Krok 4. Inicjowanie programu Mapper przy uruchamianiu „ConfigureServices”
W Startup Class musimy zainicjować utworzony przez nas profil, a także zarejestrować usługę AutoMapper.
Fragment kodu pokazujący metodę ConfigureServices, w której musimy zainicjować i zarejestrować AutoMapper.
Krok 5. Uzyskaj wynik.
Aby uzyskać wynik mapowania, musimy zadzwonić do AutoMapper.Mapper.Map i przekazać poprawne miejsce docelowe i źródło.
CodeSnippet
źródło
'Mapper' does not contain a definition for 'initialize'
. UżywamAutoMapper.Extensions.Microsoft.DependencyInjection
wersji 7.0.0Chcę rozszerzyć odpowiedzi @ theutz - mianowicie ten wiersz:
Jest to błąd ( prawdopodobnie ) w wersji 3.2.0 AutoMapper.Extensions.Microsoft.DependencyInjection. (Używam .NET Core 2.0)
Rozwiązano to w tym problemie GitHub. Jeśli twoje klasy dziedziczące klasy Profile AutoMapper istnieją poza asemblerem, w którym znajduje się klasa startowa, prawdopodobnie nie zostaną zarejestrowane, jeśli twój zastrzyk AutoMapper wygląda następująco:
chyba że wyraźnie określisz, które zespoły mają wyszukiwać profile AutoMapper.
Można to zrobić w następujący sposób w Startup.ConfigureServices:
gdzie „ asemblies ” i „type_in_assemblies” wskazują na zespół, w którym określone są klasy Profile w aplikacji. Na przykład:
Ja przypuszczam (i kładę nacisk na to słowo), które ze względu na realizację następujących przeciążenia bez parametrów (kod źródłowy z GitHub ):
polegamy na tym, że CLR ma już zestaw JITed zawierający profile AutoMapper, które mogą być lub nie być prawdziwe, ponieważ są one blokowane tylko w razie potrzeby (więcej szczegółów w tym pytaniu StackOverflow).
źródło
odpowiedź theutza tutaj jest bardzo dobra, chcę tylko dodać:
Jeśli
MapperConfigurationExpression
zamiast tego dziedziczysz profil mapowaniaProfile
, możesz po prostu dodać test, aby zweryfikować konfigurację mapowania, co zawsze jest przydatne:źródło
Rozwiązałem to w ten sposób (podobnie jak powyżej, ale wydaje mi się, że jest to czystsze rozwiązanie) dla .NET Core 2.2 / Automapper 8.1.1 z rozszerzeniami.DI 6.1.1.
Utwórz klasę MappingProfile.cs i wypełnij konstruktora Mapami (planuję użyć jednej klasy do przechowywania wszystkich moich mapowań)
W Startup.cs dodaj poniżej, aby dodać do DI (argument zestawu jest dla klasy, która przechowuje twoje konfiguracje mapowania, w moim przypadku jest to klasa MappingProfile).
W kontrolerze używaj go jak każdego innego obiektu DI
źródło
MappingProfiles
wnew Type[]{}
sposób pokazany w tej odpowiedzi nie jest konieczne.W moim Startup.cs (Core 2.2, Automapper 8.1.1)
W moim projekcie dostępu do danych
W mojej definicji modelu
źródło
services.AddAutoMapper( typeof(DAL.MapperProfile) );
zamiastservices.AddAutoMapper(new Type[] { typeof(DAL.MapperProfile) });
?Lubię wiele odpowiedzi, szczególnie jedną z @saineshwar. Używam .net Core 3.0 z AutoMapper 9.0, więc czuję, że nadszedł czas, aby zaktualizować swoją odpowiedź.
Dla mnie zadziałało Startup.ConfigureServices (...) zarejestruj usługę w ten sposób:
Myślę, że reszta odpowiedzi @saineshwar pozostaje idealna. Ale jeśli ktoś jest zainteresowany, mój kod kontrolera to:
A moja klasa mapowania:
----- EDYTOWAĆ -----
Po przeczytaniu dokumentów dołączonych w komentarzach Luciana Bargaoanu, myślę, że lepiej nieco zmienić tę odpowiedź.
Bez parametrów
services.AddAutoMapper()
(który miał odpowiedź @saineshwar) już nie działa (przynajmniej dla mnie). Ale jeśli użyjesz zestawu NuGet AutoMapper.Extensions.Microsoft.DependencyInjection, środowisko może sprawdzać wszystkie klasy, które rozszerzają AutoMapper.Profile (takie jak moje, MappingProfile).Tak więc w moim przypadku, gdy klasa należy do tego samego wykonującego zestawu, rejestracja usługi może zostać skrócona do
services.AddAutoMapper(System.Reflection.Assembly.GetExecutingAssembly());
(Bardziej eleganckim podejściem może być bezparametrowe rozszerzenie z tym kodowaniem).
Dzięki, Lucian!
źródło
Korzystam z AutoMapper 6.1.1 i asp.net Core 1.1.2.
Przede wszystkim zdefiniuj klasy Profile dziedziczone przez Profile Class of Automapper. Stworzyłem interfejs IProfile, który jest pusty, jego celem jest jedynie znalezienie klas tego typu.
Teraz utwórz oddzielną klasę, np. Mapowania
Teraz w MVC Core web Project w pliku Startup.cs, w konstruktorze, wywołaj klasę Mapping, która zainicjuje wszystkie mapowania podczas ładowania aplikacji.
źródło
W przypadku programu ASP.NET Core (testowany przy użyciu wersji 2.0+ i 3.0), jeśli wolisz czytać dokumentację źródłową: https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection/blob/master/README.md
W przeciwnym razie następujące 4 kroki działają:
Zainstaluj AutoMapper.Extensions.Microsoft.DependancyInjection z nuget.
Po prostu dodaj kilka klas profili.
Następnie dodaj poniżej swoją klasę startup.cs.
services.AddAutoMapper(OneOfYourProfileClassNamesHere)
Następnie wystarczy wstrzyknąć IMapper do kontrolerów lub tam, gdzie jest to potrzebne:
A jeśli chcesz użyć ProjectTo teraz, po prostu:
źródło
W przypadku AutoMapper 9.0.0:
MapperProfile:
W twoim startupie:
W kontrolerze lub usłudze: Inject mapper:
Stosowanie:
źródło
W najnowszych wersjach asp.net core należy użyć następującej inicjalizacji:
źródło
Asp.Net Core 2.2 z AutoMapper.Extensions.Microsoft.DependencyInjection.
W Startup.cs
źródło
Aby dodać do tego, co Arve Systad wspomniał o testowaniu. Jeśli z jakiegokolwiek powodu jesteś podobny do mnie i chcesz zachować strukturę dziedziczenia podaną w rozwiązaniu theutz, możesz skonfigurować MapperConfiguration w następujący sposób:
Zrobiłem to w NUnit.
źródło
services.AddAutoMapper (); nie działało dla mnie. (Używam Asp.Net Core 2.0)
Po skonfigurowaniu jak poniżej
zainicjuj program mapujący IMapper mapper = config.CreateMapper ();
i dodaj obiekt mapujący do usług jako usługi singleton.AddSingleton (mapper);
w ten sposób mogę dodać DI do kontrolera
i użyłem jak poniżej w moich metodach działania
źródło
Jeśli chodzi o odpowiedź theutz, nie ma potrzeby określania parametru konwertera IMapper w konstruktorze kontrolerów.
możesz użyć Mapera, ponieważ jest on statycznym elementem w dowolnym miejscu kodu.
źródło
IMapper
możesz wyśmiewać to i, na przykład, po prostu ustawić wartość zero, jeśli nie ma to znaczenia dla danego testu.