AutoMapper官方文档(五)【反向映射和复杂化】

从6.1.0开始,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();
});

通过调用ReverseMapAutoMapper会创建一个反向映射配置,其中包含复杂化:

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");

Unflattening仅为ReverseMap配置。 如果你想解unflattening,你必须配置Entity -> Dto,然后调用ReverseMap,从Dto -> Entity创建一个unflattening的类型映射配置。

自定义反向映射

AutoMapper会根据原来的扁平化自动将Customer.Name反向映射到CustomerName。 如果您使用MapFromAutoMapper将尝试反转映射:

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

只要MapFrom路径是成员访问器,AutoMapper将从相同路径(CustomerName => Customer.Name) unflatten 。

如果您需要自定义这个,对于反向映射,您可以使用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。

如果您不需要unflattening行为,则可以将此调用移除,链式调用到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());
  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值