AutoMapper对象映射使用

109 阅读1分钟

概述

传输对象跟模型对象之间的转换

配置验证: 确保映射配置都是有效的,可提前发现错误。默认不是开启的

AutoMapper 使用

包AutoMapper、AutoMapper.Extensions.Microsoft.DependencyInjection

Profile 来自AutoMapper

可以忽略某些属性、可以根据条件来判断某些属性的映射、可以根据源对象来自定义映射结果(不只是字段值,可做某些计算)

可以对每个属性进行判断,符合条件才映射,如非 null

可以ReverseMap 指定两个方向映射

source为null时,目标也为null,不会报错

public class AutoMapperConfigs : Profile {
    /// <summary>
    /// Dto的映射配置
    /// </summary>
    public AutoMapperConfigs() {
        //角色
        CreateMap<Role, RoleRes>();
        CreateMap<RoleAdd, Role>();
        CreateMap<RoleEdit, Role>();
        CreateMap<SimpleClass1, SimpleClass2>()
            .ForMember(x => x.CreationTime, map => map.Ignore())
            .ForMember(dest => dest.baz, opt => opt.Condition(src => (src.baz >= 0)))
            .ForMember(p => p.Start, opt => opt.MapFrom((src, dest) =>
            {
                if (src.ActualStart != null)
                    return src.ActualStart;
                return src.PlanStart;
            }))
            .ForAllMembers(opts => opts.Condition((src, dest, srcMember) => srcMember != null));;
    
        //ReverseMap。两个方向,可以source->dest,dest->source
    	CreateMap<LadleLeaveEto, HeatEventCreateEto>()
            .ForMember(destination => destination.EventTime, source => source.MapFrom(u => u.LeaveTime))
            .ReverseMap(); 
    }
}

//Automapper映射
builder.Services.AddAutoMapper(typeof(AutoMapperConfigs));

//自动完成映射
return _mapper.Map<UserRes>(user);

自定义映射函数示例

//自定义Map函数
CreateMap<CreateProductionStepDto, List<ProductionStation>>(MemberList.Source)
    .ConvertUsing(new ProductionStationListTypeConverter());

private class ProductionStationListTypeConverter : ITypeConverter<CreateProductionStepDto, List<ProductionStation>>
{
    public List<ProductionStation> Convert(CreateProductionStepDto source, List<ProductionStation> destination, ResolutionContext context)
    {
        return source.Stations
            .Select(sourceStation => new ProductionStation(source.Pono, Guid.Empty, sourceStation.Key, sourceStation.Value))
            .ToList();
    }
}

Abp 对 AutoMapper 的扩展

直接注册程序集中的所有配置类、简化了配置验证的写法

可以在映射时设置扩展属性、审计属性的映射,忽略属性提供了简化写法

public class MyProfile : Profile
{
    public MyProfile()
    {
        CreateMap<User, UserDto>();
        //映射扩展属性
        CreateMap<User, UserDto>()
            .MapExtraProperties();
        CreateMap<ProductDto, Product>()
            .IgnoreAuditedObjectProperties();
        CreateMap<SimpleClass1, SimpleClass2>()
            .Ignore(x => x.CreationTime);
    }
}

[DependsOn(typeof(AbpAutoMapperModule))]
public class MyModule : AbpModule
{
    public override void ConfigureServices(ServiceConfigurationContext context)
    {
        Configure<AbpAutoMapperOptions>(options =>
        {
            //注册给定类的程序集中所有的配置类,
            options.AddMaps<MyModule>();
            options.AddMaps<MyModule>(validate: true);
            options.AddProfile<MyProfile>(validate: true);
            

        });
    }
}

var user = ObjectMapper.Map<CreateUserInput, User>(input);

配置不检查属性对应

默认行为好像是检查source,配置None可跳过检查

        //检查源属性
        CreateMap<UpdateIronTappingPlanDto, IronTappingPlan>(MemberList.Source);

        //不检查属性
        CreateMap<IronTappingPlan, JobItemDto>(MemberList.None)