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