Как отобразить коллекцию свойств навигации с помощью Automapper и DI - PullRequest
0 голосов
/ 05 июня 2019

Я использую Automapper в MVC Core для сопоставления между своими сущностями и DTO и внедряю его с помощью следующего кода.

 var mappingConfig = new MapperConfiguration(mc =>
        {
            mc.CreateMissingTypeMaps = true;
            mc.AddProfile(new MappingProfile());
        });

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

У меня такие отношения.

public class ProgramDTO
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public List<AnalystDTO> Analysts { get; set; }
}

public class AnalystDTO
{
    public Guid ID { get; set; }
    public string Email { get; set; }
}

public class ProgramEntity
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public ICollection<AnalystEntity> AnalystEntitys { get; set; }
}

public class AnalystEntity
{
    public Guid ID { get; set; }
    public string Email { get; set; }
    public int ProgramEntityId { get; set; }
    public ProgramEntity ProgramEntity { get; set; }
}

Я пытаюсь сопоставить ProgramDTO и ProgramEntity, чтобы заполнить список аналитиков, но не могу найти конкретный пример.Мой профиль сопоставления в настоящее время выглядит следующим образом.

  // Program Analyst
  CreateMap<AnalystDTO, AnalystEntity>();

  CreateMap<AnalystEntity, AnalystDTO>();

  // Program
  CreateMap<ProgramDTO, ProgramEntity>();            

  CreateMap<ProgramEntity, ProgramDTO>()
            .ForMember(dest => dest.Analysts, opt => opt.MapFrom(s => Mapper.Map<IEnumerable<AnalystEntity>, IEnumerable<AnalystDTO>>(s.AnalystEntitys)));

Это сопоставление представляется логически правильным, однако после запуска кода я получаю сообщение об ошибке «Mapper not initialized», которое, как я полагаю, связано с тем, что я использую DI,

Является ли это правильным подходом для сопоставления свойств навигации с их собственными DTO и, если да, как мне получить ссылку на Mapper в профиле сопоставления?Если нет, может кто-нибудь указать мне правильное направление?Заранее спасибо!

1 Ответ

0 голосов
/ 05 июня 2019

При использовании Auto Mapper в Core вы можете использовать следующий пакет для регистрации IMapper в коллекции сервисов:

AutoMapper.Extensions.Microsoft.DependencyInjection

А затем просто использовать его как:

services.AddAutoMapper()

И этоперехватит сборки и загрузит ваш профиль (любой класс, реализующий класс Profile) и добавит его в регистрации типов

...