zoukankan      html  css  js  c++  java
  • 03.AutoMapper 之反向映射与逆向扁平化(Reverse Mapping and Unflattening)

    https://www.jianshu.com/p/d72400b337e0

    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());
  • 相关阅读:
    oracle函数大全(转载)
    oracle的基本数据类型(转载)
    oracle 数据类型详解---日期型(转载)
    队列的链式存储结构
    在Lua里写unity游戏笔记
    NGUI-快捷键
    NGUI在线电子书---NGUI for Unity
    NGUI学习笔记-UISprite
    unity延时方法Invoke和InvokeRepeating
    NGUI-制作位图字体以及图文混排
  • 原文地址:https://www.cnblogs.com/zengpeng/p/11059883.html
Copyright © 2011-2022 走看看