概述
传输对象跟模型对象之间的转换
配置验证: 确保映射配置都是有效的,可提前发现错误。默认不是开启的
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)