Automapper 9.0 Интеграция внедрения зависимостей дает ошибку - PullRequest
0 голосов
/ 27 апреля 2020

Я только начал использовать Automapper и, похоже, не могу получить правильную конфигурацию. Есть несколько противоречивых объяснений SO, и документация не совсем понятна, по крайней мере, для меня.

В настоящий момент я получаю следующую ошибку.

Unable to resolve service for type 'AutoMapper.MapperConfiguration' while attempting to activate 'JobsLedger.API.Controllers.API.App.ODataClientController

В Startup.cs У меня есть следующее:

services.AddAutoMapper(c => c.AddProfile<AutoMapping>(), typeof(Startup));

Мой профиль был настроен следующим образом:

public class AutoMapping : Profile
{
    public AutoMapping()
    {
        // Add as many of these lines as you need to map your objects
        CreateMap<Client, ClientIndexDto>();
        //CreateMap<UserDto, User>();
    }
}

и в моем контроллере у меня есть следующее:

    public class ODataClientController : ODataController, IClientController {
    private readonly MapperConfiguration _mapper;
    private IClientDATARepository _clientDATARepository;
    private readonly IClientServices _clientServices;
    private readonly DATAContext _context;

    public ODataClientController(MapperConfiguration mapper, IClientDATARepository clientDATARepository, IClientServices clientServices, DATAContext context) {
        _mapper = mapper;
        _clientDATARepository = clientDATARepository;
        _clientServices = clientServices;
        _context = context;
    }


    [HttpGet]
    [ODataRoute("AllClients()")]
    [EnableQuery()]
    public IQueryable<ClientIndexDto> Get(ODataQueryOptions<ClientIndexDto> options) 
    {
        var clients = _clientDATARepository.AllIncluding();
        var clientIndexDtos = clients.ProjectTo<ClientIndexDto>(_mapper);  // magic happens here...

        return (IQueryable<ClientIndexDto>)options.ApplyTo(clientIndexDtos);
    }

Я установил пакеты NuGet для Automapper - 9.0.0 и расширения Automapper для внедрения зависимостей 7.0.0

Это все, что я сделал для запуска и запуска. Что мне не хватает или что не так с этой реализацией.

Я использовал this с веб-сайта Code Mentor Community, и я использовал этот ответ от SO для настройки проекция.

ОБНОВЛЕНИЕ - Спасибо за то, что определили опечатку. Как я уже упоминал, существует ряд вариантов реализации, а также ряд реализаций, относящихся к версиям, некоторые из которых являются устаревший. Трудно, когда вы новичок в этом пакете, понять, что является единственным источником правды. При этом я изменил это ключевое слово MapperConfiguration на IMapper следующим образом:

    public class ODataClientController : ODataController, IClientController {
    private readonly IMapper _mapper;
    private IClientDATARepository _clientDATARepository;
    private readonly IClientServices _clientServices;
    private readonly DATAContext _context;

    public ODataClientController(IMapper mapper, IClientDATARepository clientDATARepository, IClientServices clientServices, DATAContext context) {
        _mapper = mapper;
        _clientDATARepository = clientDATARepository;
        _clientServices = clientServices;
        _context = context;
    }


    [HttpGet]
    [ODataRoute("AllClients()")]
    [EnableQuery()]
    public IQueryable<ClientIndexDto> Get(ODataQueryOptions<ClientIndexDto> options) 
    {
        var clients = _clientDATARepository.AllIncluding();
        var clientIndexDtos = clients.ProjectTo<ClientIndexDto>(_mapper);  // magic happens here...

        return (IQueryable<ClientIndexDto>)options.ApplyTo(clientIndexDtos);
    }

Теперь я получаю сообщение об ошибке:

cannot convert from 'AutoMapper.IMapper' to 'AutoMapper.IConfigurationProvider

в строке:

var clientIndexDtos = clients.ProjectTo<ClientIndexDto>(_mapper);

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Я думаю, вам нужно заменить

var clientIndexDtos = clients.ProjectTo<ClientIndexDto>(_mapper);  // magic happens here...

на

var dtos = new List<ClientIndexDto>();
foreach(var client in clients)
{
    dtos.Add(_mapper.Map<ClientIndexDto>(client));
}

Попробуйте прочитать документацию. В большинстве случаев вся информация уже доступна в официальных документах.

0 голосов
/ 27 апреля 2020

У меня была та же проблема, и оказалось, что нам нужно установить DI для Automapper 9.

Пожалуйста, попробуйте это:

var mappingConfig = new MapperConfiguration(mc =>
            {
                mc.AddProfile(new AutoMapping());
            });
            var mapper = mappingConfig.CreateMapper();
            services.AddSingleton(mapper);
...