为了账号安全,请及时绑定邮箱和手机立即绑定

03.AutoMapper 之反向映射与逆向扁平化(Reverse Mapping and Unflattening)

标签:
Java

反向映射与逆向扁平化(Reverse Mapping and Unflattening)

AutoMapper现在支持更丰富的反向映射支持。 假设有以下实体:

public class Order {
  public decimal Total { get; set; }  public Customer Customer { get; set; }
}public class Customer {
  public string Name { get; set; }
}

我们可以将它扁平化为以下DTO:

public class OrderDto {
  public decimal Total { get; set; }  public string CustomerName { get; set; }
}

我们可以双向映射,包括逆向扁平化:

Mapper.Initialize(cfg => {
  cfg.CreateMap<Order, OrderDto>()
     .ReverseMap();
});

AutoMapper通过调用ReverseMap创建了反向映射配置,其中包括逆向扁平化:

var customer = new Customer {
  Name = "Bob"};var order = new Order {
  Customer = customer,
  Total = 15.8m
};var orderDto = Mapper.Map<Order, OrderDto>(order);

orderDto.CustomerName = "Joe";

Mapper.Map(orderDto, order);

order.Customer.Name.ShouldEqual("Joe");

逆向扁平化仅针对ReverseMap进行配置。 如果你想要逆向扁平化,你必须配置Entity - > Dto然后调用ReverseMapDto - > Entity创建一个逆向扁平化类型的映射配置。

自定义反向映射

AutoMapper将根据原始扁平化规则自动将CustomerName映射为Customer.Name。 如果使用了MapFromAutoMapper将根据实际配置尝试反向映射:

cfg.CreateMap<Order, OrderDto>()
  .ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
  .ReverseMap();

只要MapFrom路径是成员访问器,AutoMapper就会从同一路径反向映射(CustomerName => Customer.Name)。

如果要自定义反向映射路径,可以使用ForPath

cfg.CreateMap<Order, OrderDto>()
  .ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
  .ReverseMap()
  .ForPath(s => s.Customer.Name, opt => opt.MapFrom(src => src.CustomerName));

上面的列子没有多大意义,因为原始MapFrom会自动反向映射。只有在映射和反向映射路径不同时才使用ForPath进行设置。

如果不想要逆向扁平化行为,可以不调用ReverseMap,然后单独创建两个映射配置。 或者使用Ignore

cfg.CreateMap<Order, OrderDto>()
  .ForMember(d => d.CustomerName, opt => opt.MapFrom(src => src.Customer.Name))
  .ReverseMap()
  .ForPath(s => s.Customer.Name, opt => opt.Ignore());



作者:这个用户有点逗
链接:https://www.jianshu.com/p/d72400b337e0


点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消