首页 > 解决方案 > 如何使用 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));
    }
}

标签: asp.netautomapper

解决方案


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

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

我不能发表评论,否则,我会,而不是写一个答案。


推荐阅读