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匹配。只要目标属性命名符合规定,就不需要在单独配置属性匹配规则。

原文地址:https://www.cnblogs.com/zengpeng/p/11059877.html