如何使用 Automapper 和 DI 映射导航 属性 集合

How to map navigation property collection with Automapper and DI

我在 MVC Core 中使用 Automapper 在我的实体和 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 的引用?如果没有,有人可以指出我正确的方向吗?提前致谢!

在 Core 中使用 Auto Mapper 时,您可以利用以下包将 IMapper 注册到服务集合:

AutoMapper.Extensions.Microsoft.DependencyInjection

然后像这样使用它:

services.AddAutoMapper()

这将嗅探程序集并加载您的配置文件(任何实现配置文件 class 的 class)并将其添加到类型注册中