如何使用Automapper映射复杂对象?

时间:2018-05-07 15:05:53

标签: asp.net automapper

我正在尝试在CustomDtoMapper中映射2个复杂对象而无法执行此操作,因为第二个映射似乎不起作用。

从DtoInputEntity到EntityLine的第二个映射导致空值。没有任何值被分配。

这是我的CustomDtoMapper类:

internal static class CustomDtoMapper
{
    private static volatile bool _mappedBefore;

    private static readonly object SyncObj = new object();

    public static void CreateMappings(IMapperConfigurationExpression mapper)
    {
        lock (SyncObj)
        {
            if (_mappedBefore)
            {
                 return;
            }

            CreateMappingsInternal(mapper); 

            _mappedBefore = true;
        }
    }


    private static void CreateMappingsInternal(IMapperConfigurationExpression mapper)
    {
        mapper.CreateMap<User, UserEditDto>()
            .ForMember(dto => dto.Password, options => options.Ignore())
            .ReverseMap()
            .ForMember(user => user.Password, options => options.Ignore());

        mapper.CreateMap<DtoInputEntity, Entity>()
            .ForMember(entityCreateDto => entityCreateDto.OrderNumber,
            dtoInputEntity => dtoInputEntity.MapFrom(input => input.Response.OrderNumber))
            .ForMember(entityCreateDto => entityCreateDto.ShipmentNumber,
            dtoInputEntity => dtoInputEntity.MapFrom(input => input.Response.ShipmentNumber));

        mapper.CreateMap<DtoInputEntity, EntityLine>()
            .ForPath(entityLineCreateDto => entityLineCreateDto.ExternalModelIdentifier, opt => opt.MapFrom(dtoInputEntity => dtoInputEntity.Response.UTModelIdentifier))
            .ForPath(entityLineCreateDto => entityLineCreateDto.SKU, opt => opt.MapFrom(dtoInputEntity => dtoInputEntity.Response.ModelIdentifier))
            .ForPath(entityLineCreateDto => entityLineCreateDto.ShipmentNumber, opt => opt.MapFrom(dtoInputEntity => dtoInputEntity.Response.ShipmentNumber))
            .ForPath(entityLineCreateDto => entityLineCreateDto.LineNumber, opt => opt.MapFrom(dtoInputEntity => dtoInputEntity.Response.LineNumber));
    }
}

1 个答案:

答案 0 :(得分:0)

我已经创建了一个虚拟应用程序来测试您的问题,我似乎无法复制它。因此,我怀疑您的映射器实例管理可能有问题,而不是您的初始化。例如,您可能正在使用与初始化实例不同的实例(考虑到初始化程序是静态的,只执行一次)。

作为旁注,为什么使用ForPath,而不是ForMember?

我无法评论,否则,我会,而不是写一个答案。