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