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

时间:2019-06-05 13:21:57

标签: c# dependency-injection asp.net-core-mvc automapper navigation-properties

我正在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)));

此映射在逻辑上似乎是正确的,但是,在运行代码时,我收到错误“未初始化映射器”,我认为这是因为我正在使用DI。

这是将导航属性映射到其自己的DTO的正确方法吗?如果是,如何在映射配置文件中获得对Mapper的引用?如果没有,有人可以指出我正确的方向吗?提前致谢!

1 个答案:

答案 0 :(得分:0)

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

services.AddAutoMapper()

然后像这样使用它:

ENGINE_set_ECDH(ENGINE *e, ECDH_METHOD * ecdh)

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