zoukankan      html  css  js  c++  java
  • 02.AutoMapper 之扁平化(Flattening)

    https://www.jianshu.com/p/65099590c930

     

    扁平化(Flattening)

    对象映射器的常见用法是将一个复杂对象模型扁平化为一个简单模型。例如您有一个以下复杂模型:

    public class Order
    {
        private readonly IList<OrderLineItem> _orderLineItems = new List<OrderLineItem>();
    
        public Customer Customer { get; set; }
    
        public OrderLineItem[] GetOrderLineItems()
        {
            return _orderLineItems.ToArray();
        }
    
        public void AddOrderLineItem(Product product, int quantity)
        {
            _orderLineItems.Add(new OrderLineItem(product, quantity));
        }
    
        public decimal GetTotal()
        {
            return _orderLineItems.Sum(li => li.GetTotal());
        }
    }
    
    public class Product
    {
        public decimal Price { get; set; }
        public string Name { get; set; }
    }
    
    public class OrderLineItem
    {
        public OrderLineItem(Product product, int quantity)
        {
            Product = product;
            Quantity = quantity;
        }
    
        public Product Product { get; private set; }
        public int Quantity { get; private set;}
    
        public decimal GetTotal()
        {
            return Quantity*Product.Price;
        }
    }
    
    public class Customer
    {
        public string Name { get; set; }
    }
    

    我们希望将这个复杂的Order对象扁平化为一个更简单的OrderDto,它只包含特定场景所需的数据:

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

    当您在AutoMapper中配置源/目标类型对时,配置程序会尝试将源类型上的属性和方法与目标类型上的属性进行匹配。如果对于目标类型上任何属性,在源类型上没有匹配的属性、方法或者Get前缀的方法,AutoMapper根据PascalCase约定将目标成员名称拆分为单个单词。

    // 复杂模型
    
    var customer = new Customer
        {
            Name = "George Costanza"
        };
    var order = new Order
        {
            Customer = customer
        };
    var bosco = new Product
        {
            Name = "Bosco",
            Price = 4.99m
        };
    order.AddOrderLineItem(bosco, 15);
    
    // 配置 AutoMapper
    
    Mapper.Initialize(cfg => cfg.CreateMap<Order, OrderDto>());
    
    // 执行映射
    
    OrderDto dto = Mapper.Map<Order, OrderDto>(order);
    
    dto.CustomerName.ShouldEqual("George Costanza");
    dto.Total.ShouldEqual(74.85m);
    

    AutoMapper中使用CreateMap方法配置类型映射。AutoMapper只能映射它识别的类型对,所以我们用CreateMap显式注册了源/目标类型对。使用Map方法执行映射。

    OrderDto类型上,Total属性与 Order类型的GetTotal() 方法匹配。CustomerName属性与Order类型的Customer.Name匹配。只要目标属性命名符合规定,就不需要在单独配置属性匹配规则。

  • 相关阅读:
    委托与事件参数的简单运用
    C#消息队列专题
    项目计划流程简易描述
    cookies 客户端历史记录篇
    朋友做的VS2005插件:等号两边值互换
    SSE2指令集系列之二
    SSSE3指令集
    SSE3指令集系列
    SSE特殊指令集系列之一
    SSE2指令集系列之一
  • 原文地址:https://www.cnblogs.com/zengpeng/p/11059877.html
Copyright © 2011-2022 走看看