Я относительно новичок в .NET, и я решил заняться .NET Core вместо изучения «старых способов». Я нашел подробную статью о настройке AutoMapper для .NET Core здесь , но есть ли более простой способ для новичка?
c#
asp.net-core
automapper
theutz
источник
источник
Ответы:
Я понял! Вот подробности:
Добавьте AutoMapper Dependency Injection Package к своему решению через NuGet .
Создайте новый класс для профиля сопоставления. (Я сделал класс в главном каталоге решения называется
MappingProfile.cs
и добавить следующий код.) Я буду использоватьUser
иUserDto
объект в качестве примера.Затем добавьте AutoMapperConfiguration
Startup.cs
как показано ниже:Чтобы вызвать сопоставленный объект в коде, сделайте что-то вроде следующего:
Я надеюсь, что это поможет кому-то начать с ASP.NET Core! Я приветствую любые отзывы или критику, так как я все еще новичок в мире .NET!
источник
Profile
расположены классыШаг Использовать AutoMapper с ASP.NET Core.
Шаг 1. Установка AutoMapper.Extensions.Microsoft.DependencyInjection из пакета NuGet.
Шаг 2. Создайте папку в решении, чтобы сохранить сопоставления с именем «сопоставления».
Шаг 3. После добавления папки Mapping мы добавили класс с именем « MappingProfile », это имя может быть уникальным и полезным для понимания.
В этом классе мы собираемся сохранить все отображения.
Шаг 4. Инициализация Mapper при запуске «ConfigureServices»
В классе запуска нам нужно инициализировать созданный нами профиль, а также зарегистрировать службу AutoMapper.
Фрагмент кода, чтобы показать метод ConfigureServices, где нам нужно инициализировать и зарегистрировать AutoMapper.
Шаг 5. Получите вывод.
Чтобы получить результат Mapped, нам нужно вызвать AutoMapper.Mapper.Map и передать правильный пункт назначения и источник.
CodeSnippet
источник
'Mapper' does not contain a definition for 'initialize'
. Я используюAutoMapper.Extensions.Microsoft.DependencyInjection
версию 7.0.0Я хочу расширить ответы @ theutz, а именно:
Существует ошибка ( вероятно ) в AutoMapper.Extensions.Microsoft.DependencyInjection версии 3.2.0. (Я использую .NET Core 2.0)
Это решается в этой проблеме GitHub. Если ваши классы, наследующие класс Profile AutoMapper, существуют вне сборки, где вы используете класс Startup, они, вероятно, не будут зарегистрированы, если ваша инъекция AutoMapper выглядит следующим образом:
если вы явно не укажете, какие сборки искать в профилях AutoMapper.
Это можно сделать так в вашем Startup.ConfigureServices:
где «сборки» и «type_in_assemblies» указывают на сборку, где указаны классы профиля в вашем приложении. Например:
Я полагаю (и я подчеркиваю это слово), что из-за последующей реализации перегрузки без параметров (исходный код из GitHub ):
мы полагаемся на то, что в CLR уже имеется сборка JIT, содержащая профили AutoMapper, которые могут быть или не быть истинными, поскольку они объединяются только при необходимости (более подробно в этом вопросе StackOverflow).
источник
ответ theutz здесь очень хороший, я просто хочу добавить это:
Если вы позволяете вашему отображение профиль наследует от
MapperConfigurationExpression
вместоProfile
, вы можете очень просто добавить тест , чтобы проверить правильность настройки отображения, которое всегда под рукой:источник
Я решил это таким образом (похоже на выше, но я чувствую, что это более чистое решение) для .NET Core 2.2 / Automapper 8.1.1 с Extensions.DI 6.1.1.
Создать класс MappingProfile.cs и заполнить конструктор Maps (я планирую использовать один класс для хранения всех моих отображений)
В Startup.cs добавьте ниже, чтобы добавить в DI (arg сборки предназначен для класса, который содержит ваши конфиги отображения, в моем случае это класс MappingProfile).
В контроллере используйте его так же, как любой другой объект DI
источник
MappingProfiles
с ,new Type[]{}
как показано в этом ответе не требуется.В моем Startup.cs (Core 2.2, Automapper 8.1.1)
В моем проекте доступа к данным
В моем определении модели
источник
services.AddAutoMapper( typeof(DAL.MapperProfile) );
вместоservices.AddAutoMapper(new Type[] { typeof(DAL.MapperProfile) });
?Мне нравится много ответов, в частности, @saineshwar. Я использую .net Core 3.0 с AutoMapper 9.0, поэтому я чувствую, что пришло время обновить его ответ.
То, что работало для меня, было в Startup.ConfigureServices (...) зарегистрировать сервис следующим образом:
Я думаю, что остальная часть ответа @saineshwar остается идеальной. Но если кому-то интересно, мой код контроллера:
И мой класс картографии:
----- РЕДАКТИРОВАТЬ -----
После прочтения документов, связанных в комментариях Лучана Баргаоану, я думаю, что лучше немного изменить этот ответ.
services.AddAutoMapper()
Без параметров (у которых был ответ @saineshwar) больше не работает (по крайней мере, для меня). Но если вы используете сборку NuGet AutoMapper.Extensions.Microsoft.DependencyInjection, платформа сможет проверять все классы, расширяющие AutoMapper.Profile (например, мой, MappingProfile).Таким образом, в моем случае, когда класс принадлежит одной и той же исполняющей сборке, регистрация службы может быть сокращена до
services.AddAutoMapper(System.Reflection.Assembly.GetExecutingAssembly());
(более элегантный подход мог бы быть расширением без параметров с этим кодированием).
Спасибо, Люциан!
источник
Я использую AutoMapper 6.1.1 и asp.net Core 1.1.2.
Прежде всего, определите классы профиля, унаследованные классом профиля Automapper. Я создал интерфейс IProfile, который пуст, цель состоит только в том, чтобы найти классы этого типа.
Теперь создайте отдельный класс, например, Mappings
Теперь в веб-проекте MVC Core в файле Startup.cs в конструкторе вызовите класс Mapping, который будет инициализировать все сопоставления во время загрузки приложения.
источник
Для ASP.NET Core (протестировано с использованием 2.0+ и 3.0), если вы предпочитаете читать исходную документацию: https://github.com/AutoMapper/AutoMapper.Extensions.Microsoft.DependencyInjection/blob/master/README.md
В противном случае следующие 4 шага работают:
Установите AutoMapper.Extensions.Microsoft.DependancyInjection из nuget.
Просто добавьте несколько профильных классов.
Затем добавьте ниже в свой класс startup.cs.
services.AddAutoMapper(OneOfYourProfileClassNamesHere)
Затем просто вставьте IMapper в свои контроллеры или куда вам нужно:
И если вы хотите использовать ProjectTo сейчас, просто:
источник
Для AutoMapper 9.0.0:
MapperProfile:
В вашем стартапе:
В контроллере или сервисе: Inject Mapper:
Использование:
источник
В последних версиях ядра asp.net вы должны использовать следующую инициализацию:
источник
Asp.Net Core 2.2 с AutoMapper.Extensions.Microsoft.DependencyInjection.
В Startup.cs
источник
Чтобы добавить то, что Арве Систад упомянул для тестирования. Если по какой-либо причине вы похожи на меня и хотите сохранить структуру наследования, представленную в решении theutz, вы можете настроить MapperConfiguration следующим образом:
Я сделал это в NUnit.
источник
services.AddAutoMapper (); не работал для меня (Я использую Asp.Net Core 2.0)
После настройки, как показано ниже
инициализировать преобразователь IMapper mapper = config.CreateMapper ();
и добавьте объект mapper к сервисам как singleton services.AddSingleton (mapper);
таким образом, я могу добавить DI в контроллер
и я использовал, как показано ниже, в моих методах действий
источник
Что касается ответа theutz, то нет необходимости указывать параметр IMapper mapper в конструкторе контроллеров.
Вы можете использовать Mapper, поскольку он является статическим элементом в любом месте кода.
источник
IMapper
вы можете смоделировать это и, например, просто заставить его вернуть ноль, если это не имеет отношения к данному тесту.