如何使用 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)并将其添加到类型注册中
我在 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)并将其添加到类型注册中