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());
  • 相关阅读:
    简单的spring--mvc整合
    spring配置mybatis的sqlsessionfactory
    spring配置hibernate的sessionFactory
    spring关于bean的一些配置说明
    采用多个数据源是Spring的配置
    如何将Win10 的环境变量页面设置用在win7上面?
    了解常用的开源机器学习项目
    PyCharm导入tensorflow包报错的问题
    python 结巴分词(jieba)详解
    pylint
  • 原文地址:https://www.cnblogs.com/zengpeng/p/11059883.html
Copyright © 2011-2022 走看看