扁平化(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);// 配置 AutoMapperMapper.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.jianshu.com/p/65099590c930
点击查看更多内容
为 TA 点赞
评论
共同学习,写下你的评论
评论加载中...
作者其他优质文章
正在加载中
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦