为了账号安全,请及时绑定邮箱和手机立即绑定

02.AutoMapper 之扁平化(Flattening)

标签:
Java

扁平化(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 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消