Некоторое время назад я работал над проектом 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 имеет некоторые параметры. что я должен отправить в этот параметр?





Вероятно, вы обновили свои зависимости 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, и ошибка решена.
сделать в консоли dotnet add package AutoMapper.Extensions.Microsoft.DependencyInjection --version 8.0.1
В новой версии (6.1) пакета AutoMapper.Extensions.Microsoft.DependencyInjection nuget вы должны использовать его следующим образом:
services.AddAutoMapper(Type assemblyTypeToSearch);
// OR
services.AddAutoMapper(params Type[] assemblyTypesToSearch);
например:
services.AddAutoMapper(typeOf(yourClass));
Что вы подразумеваете под типом сборки? У меня множество профилей, поэтому я не могу позволить себе добавлять их по одному. Извините, что вы новичок в C# здесь. Спасибо!
Что-то вроде services.AddAutoMapper(typeOf(yourClass));
Да, я имею в виду, что эти ответы упомянуты выше, и это действительно работает, но мне просто интересно, что может быть объяснением того, какой тип сборки. Извини, я действительно новичок
Я имею в виду один или несколько типов в сборке. если хотите найти, что такое сборка stackoverflow.com/questions/1362242/…
Если вы используете AspNet Core 2.2 и AutoMapper.Extensions.Microsoft.DependencyInjection v6.1 Вам нужно использовать в файле запуска
services.AddAutoMapper(typeof(Startup));
К вашему сведению, следующий, который столкнется с этим: мне пришлось установить Microsoft.Extensions.DependencyInjection.Abstractions, чтобы сделать services.AddAutoMapper (typeof (Startup)); Работа
в .net core 2.2 это устранило ошибку сборки для меня, но все равно не удалось во время выполнения из-за отсутствия конфигураций сопоставления ... что сработало для меня, так это перечислить все мои классы профиля внутри оператора. то есть: services.AddAutoMapper (typeof (profileClassName1), typeof (prof ileClassName2));
Комментарий @nirweiner правильный, но вам нужно указать только на один из классов профиля, потому что он запрашивает сборку для поиска. Ответ dev-siberia работает, если конфигурации вашего профиля находятся в той же сборке.
У меня ничего из этого не сработало, у меня есть проект .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
Большое спасибо за размещение этого полного примера!
Это единственный пример, который у меня сработал. Спасибо!
Официальные документы: 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 для дополнительного проекта в моем решении. Спасибо, братан.
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));
Не смешивайте версии .NET Core. Вероятно, у вас есть ссылки на некоторые сборки 1.1 .NET Core или ASP.NET Core. Вам необходимо обновить ВСЕ из них до той же версии (например, 2.0 или 2.1-rc), или вы все еще ссылаетесь на устаревшую версию Automapper