Попытка добавить 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.

Ошибка CS0121 Вызов неоднозначен между следующими методами или свойствами: 'ServiceCollectionExtensions.AddAutoMapper(IServiceCollection, params Assembly [])' и 'ServiceCollectionExtensions.AddAutoMapper(IServiceCollection, params Type [])'

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

Ответ 1

Вероятно, вы обновили свои зависимости 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.Abstractions 1.1.0 и не могут использоваться с ASP.NET Core, поскольку произошли серьезные изменения между Microsoft.Extensions.DependencyInjection.Abstractions 1.1.0 и 2.0.

Ответ 2

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

services.AddAutoMapper(typeof(Startup));

Ответ 3

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

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

Ответ 4

У меня ничего из этого не получилось, у меня есть проект .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

Ответ 5

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

Вы определяете конфигурацию, используя профили. И тогда вы позволите AutoMapper знает, в каких сборках эти профили определены вызов метода расширения IServiceCollection AddAutoMapper в запуск:

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

или типы маркеров:

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

Ответ 6

Я решил это, создав класс, который наследует 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 ));

Ответ 7

@dev-siberia, ваше решение работало как прелесть в .Net Core 2.2.

Ответ 8

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

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