Пытаетесь добавить AutoMapper в Asp.net Core 2?

Некоторое время назад я работал над проектом asp.net core 1.1 и использую его в Projetc AutoMapper.

в asp.net core 1.1 я добавляю services.AddAutoMapper() в файл запуска:

Файл StartUp в asp.net core 1.1:

    public void ConfigureServices(IServiceCollection services)
    {
        //Some Code

        services.AddMvc();
        services.AddAutoMapper();
    }

И я легко использую AutoMapper в контроллере.

Контроллер:

 public async Task<IActionResult> AddEditBook(AddEditBookViewModel model)
 {
    Book bookmodel = AutoMapper.Mapper.Map<AddEditBookViewModel, Book>(model);
    context.books.Add(bookmodel);
    context.SaveChanges();
 }

И все было нормально. Но в настоящее время я работаю над проектом Asp.net Core 2 и получаю сообщение об ошибке services.AddAutoMapper() в файле sturtap.

Error CS0121 The call is ambiguous between the following methods or properties: 'ServiceCollectionExtensions.AddAutoMapper(IServiceCollection, params Assembly[])' and 'ServiceCollectionExtensions.AddAutoMapper(IServiceCollection, params Type[])'

В чем причина этой ошибки? Также services.AddAutoMapper в asp.net core 2 имеет некоторые параметры. что я должен отправить в этот параметр?

Не смешивайте версии .NET Core. Вероятно, у вас есть ссылки на некоторые сборки 1.1 .NET Core или ASP.NET Core. Вам необходимо обновить ВСЕ из них до той же версии (например, 2.0 или 2.1-rc), или вы все еще ссылаетесь на устаревшую версию Automapper

Tseng 18.05.2018 14:28
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
60
1
46 927
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Ответ принят как подходящий

Вероятно, вы обновили свои зависимости ASP.NET Core, но по-прежнему используете устаревший пакет AutoMapper.Extensions.Microsoft.DependencyInjection.

Для ASP.NET Core вам нужна как минимум версия 3.0.1 от https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/3.0.1

Что ссылается на AutoMapper 6.1.1 или выше.

AutoMapper (>= 6.1.1)

Microsoft.Extensions.DependencyInjection.Abstractions (>= 2.0.0)

Microsoft.Extensions.DependencyModel (>= 2.0.0)

Более старые пакеты зависят от Microsoft.Extensions.DependencyInjection.Abstractions1.1.0 и не могут использоваться с ASP.NET Core, поскольку между Microsoft.Extensions.DependencyInjection.Abstractions 1.1.0 и 2.0 произошли критические изменения.

Спасибо. Я обновил AutoMapper.Extensions.Microsoft.DependencyInjection, и ошибка решена.

topcool 18.05.2018 14:39

сделать в консоли dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection --version 8.0.1

Developer Marius Žilėnas 29.07.2020 07:35

В новой версии (6.1) пакета AutoMapper.Extensions.Microsoft.DependencyInjection nuget вы должны использовать его следующим образом:

services.AddAutoMapper(Type assemblyTypeToSearch);
// OR
services.AddAutoMapper(params Type[] assemblyTypesToSearch);

например:

services.AddAutoMapper(typeOf(yourClass)); 

Что вы подразумеваете под типом сборки? У меня множество профилей, поэтому я не могу позволить себе добавлять их по одному. Извините, что вы новичок в C# здесь. Спасибо!

Siege21x 16.01.2020 11:21

Что-то вроде services.AddAutoMapper(typeOf(yourClass));

Mohammad Dayyan 16.01.2020 19:23

Да, я имею в виду, что эти ответы упомянуты выше, и это действительно работает, но мне просто интересно, что может быть объяснением того, какой тип сборки. Извини, я действительно новичок

Siege21x 16.01.2020 19:46

Я имею в виду один или несколько типов в сборке. если хотите найти, что такое сборка stackoverflow.com/questions/1362242/…

Mohammad Dayyan 16.01.2020 20:49

Если вы используете AspNet Core 2.2 и AutoMapper.Extensions.Microsoft.DependencyInjection v6.1 Вам нужно использовать в файле запуска

services.AddAutoMapper(typeof(Startup));

К вашему сведению, следующий, который столкнется с этим: мне пришлось установить Microsoft.Extensions.DependencyInjection.Abstractions, чтобы сделать services.AddAutoMapper (typeof (Startup)); Работа

Marius 22.05.2019 07:08

в .net core 2.2 это устранило ошибку сборки для меня, но все равно не удалось во время выполнения из-за отсутствия конфигураций сопоставления ... что сработало для меня, так это перечислить все мои классы профиля внутри оператора. то есть: services.AddAutoMapper (typeof (profileClassName1), typeof (prof‌ ileClassName2));

nir weiner 29.08.2019 10:00

Комментарий @nirweiner правильный, но вам нужно указать только на один из классов профиля, потому что он запрашивает сборку для поиска. Ответ dev-siberia работает, если конфигурации вашего профиля находятся в той же сборке.

CularBytes 22.09.2019 16:48

У меня ничего из этого не сработало, у меня есть проект .NET Core 2.2, и полный код для настройки маппера выглядит так (часть метода ConfigureService ()):

    // Auto Mapper Configurations
    var mappingConfig = new MapperConfiguration(mc =>
    {
        mc.AddProfile(new SimpleMappings());
    });

    IMapper mapper = mappingConfig.CreateMapper();
    services.AddSingleton(mapper);

Затем у меня есть класс Mappings, который я поместил в проект BL:

public class SimpleMappings : Profile
    {
        public SimpleMappings()
        {
            CreateMap<DwUser, DwUserDto>();
            CreateMap<DwOrganization, DwOrganizationDto>();
        }
    }

И, наконец, использование маппера выглядит так:

public class DwUserService : IDwUserService
    {
        private readonly IDwUserRepository _dwUserRepository;
        private readonly IMapper _mapper;

        public DwUserService(IDwUserRepository dwUserRepository, IMapper mapper)
        {
            _dwUserRepository = dwUserRepository;
            _mapper = mapper;
        }

        public async Task<DwUserDto> GetByUsernameAndOrgAsync(string username, string org)
        {
            var dwUser = await _dwUserRepository.GetByUsernameAndOrgAsync(username, org).ConfigureAwait(false);
            var dwUserDto = _mapper.Map<DwUserDto>(dwUser);

            return dwUserDto;
        }
}

Вот аналогичная ссылка на ту же тему: Как настроить Automapper в ASP.NET Core

Большое спасибо за размещение этого полного примера!

SWalters 05.07.2019 22:01

Это единственный пример, который у меня сработал. Спасибо!

Jemes 28.01.2020 14:00

Официальные документы: https://automapper.readthedocs.io/en/latest/Dependency-injection.html#asp-net-core

You define the configuration using profiles. And then you let AutoMapper know in what assemblies are those profiles defined by calling the IServiceCollection extension method AddAutoMapper at startup:

services.AddAutoMapper(profileAssembly1, profileAssembly2 /*, ...*/);

or marker types:

services.AddAutoMapper(typeof(ProfileTypeFromAssembly1), typeof(ProfileTypeFromAssembly2) /*, ...*/);

Я решил это, создав класс, наследующий AutoMapper.Profile

    public class model_to_resource_profile : Profile
    {
        public model_to_resource_profile()
        {
            CreateMap<your_model_class, your_model_resource_class>();
        }
    }

И добавляем эту строку в Startup.cs:

services.AddAutoMapper(typeof(model_to_resource_profile ));

попробуйте это, работает с 2.1 и выше, я не использовал предыдущую версию, поэтому не могу сказать.

services.AddAutoMapper(AppDomain.CurrentDomain.GetAssemblies());

Этот ответ работает для меня, когда я выполняю AutoMapper для дополнительного проекта в моем решении. Спасибо, братан.

Fadhly Permata 22.04.2020 20:12

6 декабря 2019 г. На основе первоначальной попытки пройти курс множественного взгляда «Создание API с помощью ASP.NET Core», автор Шон Вильдермут. Как я получил ошибку "... неоднозначный 'ServiceCollectionExtensions.AddAutoMapper (IServiceCollection, params Assembly []) ..."

Я начал исследовать правильный синтаксис для реализации AddAutoMapper в Core 2.2. Моя ссылка на NuGet - версия 7.0.0 После того, как в руководстве я создал класс Profile в моем каталоге репозитория данных, который дополнительно ссылался на мою модель nir weiner & dev-siberia, ответы выше привели меня к попытке сослаться на класс профиля в Startup.ConfigureServices ( ) по имени:

services.AddAutoMapper(typeof(CampProfile));

содержимое класса профиля - это просто (без каламбура) старая школьная карта класса данных и модели в его конструкторе

this.CreateMap<Camp, CampModel>();  

Это решило проблему нехватки документации для текущей версии.

С уважением,

Христианинпрограммист

Если вы используете AspNet Core 2.2, попробуйте изменить свой код

из:

services.AddAutoMapper();

к:

services.AddAutoMapper(typeof(Startup));

У меня это сработало.

Установить пакет:

Install-Package AutoMapper.Extensions.Microsoft.DependencyInjection -Version 7.0.0

Нугет:
https://www.nuget.org/packages/AutoMapper.Extensions.Microsoft.DependencyInjection/

В классе запуска:

services.AddAutoMapper(typeof(Startup));

Другие вопросы по теме