写在前面

知道AutoMapper很久了,但是一直没有用,最近刚好有个场景需要就用了,果然是利器。看了git上的wiki,发现内容其实wiki上写的很全面了,深入的暂时还没挖掘到。不过和群里的朋友交流了下,觉得充当下搬运工,小小的翻译下还是挺好的,小弟不才,希望看客大牛们轻拍砖。

什么是AutoMapper?

AutoMapper是一个完善的Mapping工具,所谓Mapping即数据对象转换,借用群里朋友的话是多用于领域对象和DTO对象的Mapping或者是SqlDataReader的Mapping。

Git主页:https://github.com/AutoMapper/AutoMapper

Wiki主页:https://github.com/AutoMapper/AutoMapper/wiki

简单的例子

场景是这样的在订单业务里,有Order、Customer、Product三个对象如下,其中Product被包含在OrderLinItem对象中:

 1 public class Order
 2 {
 3   private readonly IList<OrderLineItem> _orderLineItems = new List<OrderLineItem>();
 4
 5   public Customer Customer { get; set; }
 6
 7   public OrderLineItem[] GetOrderLineItems()
 8   {
 9     return _orderLineItems.ToArray();
10   }
11
12   public void AddOrderLineItem(Product product, int quantity)
13   {
14     _orderLineItems.Add(new OrderLineItem(product, quantity));
15   }
16
17   public decimal GetTotal()
18   {
19     return _orderLineItems.Sum(li => li.GetTotal());
20   }
21 }
22 }
23
24 public class OrderLineItem
25 {
26   public OrderLineItem(Product product, int quantity)
27   {
28     Product = product;
29     Quantity = quantity;
30   }
31
32   public Product Product { get; private set; }
33   public int Quantity { get; private set;}
34
35   public decimal GetTotal()
36   {
37     return Quantity*Product.Price;
38   }
39 }
40
41 public class Customer
42 {
43   public string Name { get; set; }
44 }
45
46 public class Product
47 {
48   public decimal Price { get; set; }
49   public string Name { get; set; }
50 }

View Code

  然后在页面上我需要展示一些数据,为了保持页面ViewModel的独立,定义一个DTO(OrderDto)只包含了页面需要的字段,如下:

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

View Code

然后问题来了,怎么转换呢?

我想最简单的方法肯定是这样子:

//定义一个order
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);//转换
var dto = new OrderDto();
dto.CustomerName = order.Customer.Name;
dto.Total = order.GetTotal();

上面的代码看起来很简单没什么问题,但是如果dto属性有很多个呢?反复的手动Mapping会不会有点累?这时候攻城狮就得发挥偷懒精神,以下是使用了AutoMapper的代码:

// 配置一个 AutoMapper 映射

Mapper.CreateMap<Order, OrderDto>();// 执行 mapping
OrderDto dto = Mapper.Map<Order, OrderDto>(order);

是不是很简单简洁了,但是细心的会发现,这个Mapping稍微有点复杂,CustomerName对应的是order.Customer.Name;Total对应的是GetTotal方法。AutoMaper是如何做到,又是如何定义这个规则的呢?

AutoMapper的简单默认Mapping规则

1. 针对复杂对象到简单对象的映射,Mapping遵循驼峰命名的规则,即当目标dto属性名称在源对象中找不到时,AutoMapper会根据驼峰命名规则拆分dto属性名(例如:CustomerName=>Customer.Name)去寻找相应的关系。

2. 针对是源对象中存在Get开头的属性(例如 Total => GetTotal),如果找不到同名属性,则会匹配Get+PropertyName的方法。

本文搬运自AutoMapper Wiki之Flattening:https://github.com/AutoMapper/AutoMapper/wiki/Flattening

上面的规则是最简单的匹配规则,对于复杂的Mapping,完全不符合上面的两条特性的,那么就需要进行Mapping的自定义配置,下节 《AutoMapper之自定义映射》里,我会为大家搬运。有啥疑问和意见可以给我留言,咱们来探讨一番,请大拿不吝赐教~!

转载于:https://www.cnblogs.com/capqueen/p/AutoMapperHammalOne.html

AutoMapper搬运工之初探AutoMapper相关推荐

  1. AutoMapper搬运工之自定义类型转换

    前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NE ...

  2. [AutoMapper]反射自动注册AutoMapper Profile

    AutoMapper 帮我我们方便管理物件跟物件之间属性值格式转换 模型转换 这里有两个类别 UserInfoModel 当作我们从DB捞取出来模型资料 public class UserInfoMo ...

  3. C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用

    前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...

  4. AutoMapper 入门

    简述 开篇,介绍一下AutoMapper,欢迎. AutoMapper是什么:通过预先配置,将两个不同类型的对象进行转换的工具. AutoMapper干什么用:更方便的转换两个不同类型的对象. Aut ...

  5. AutoMapper入门使用

    AutoMapper入门使用 在应用开发的过程中,首先要了解整个系统中各个系统的组件的作用,然后了解系统的工作流(workflow),最后需要梳理一遍数据流(dataflow),而在整理数据流的过程中 ...

  6. AutoMapper在ABP框架中的使用说明

    为了说明AutoMapper如何使用,我专门开设了一个专题来讲,如果您还没有查看该专题,请点击这里.既然系统地学习了AutoMapper,那么接下来就是该用它实战的时候了.今天,我们就来揭开AutoM ...

  7. AutoMapper多个对象映射到一个Dto对象

    一.定义源映射对象 为了体现AutoMapper映射特性,在SocialAttribute中的Name属性没有定义在People中,People的Ear属性也不存在与SocialAttribute和P ...

  8. 一步一步创建ASP.NET MVC5程序[Repository+Autofac+Automapper+SqlSugar](五)

    前言 Hi,大家好,我是Rector 时间飞逝,一个星期又过去了,今天还是星期五,Rector在图享网继续跟大家分享系列文本:一步一步创建ASP.NET MVC5程序[Repository+Autof ...

  9. automapper自动创建映射_ASP.NET Core教程:ASP.NET Core使用AutoMapper

    一.前言 在实际的项目开发过程中,我们使用各种ORM框架可以使我们快捷的获取到数据,并且可以将获取到的数据绑定到对应的List中,然后页面或者接口直接显示List中的数据.但是我们最终想要显示在视图或 ...

最新文章

  1. 云计算设计模式(十)——守门员模式
  2. 奇淫怪巧之在Delphi中调用不申明函数
  3. RHEL部署ipa红帽身份验证
  4. 大牛书单 | 人工智能方向好书推荐
  5. java class类型参数_java – 如何从通用类型参数获取`.class`属性?
  6. 如何阻止YouTube在iOS,Android和Web上自动播放视频
  7. 照片识别出错_云投诉丨四川德阳市民文明手册咋满篇乱码?回应:电脑识别问题,已全部收回...
  8. 【ES7(2016)】Array.prototype.includes()
  9. mbed试玩—高速开发MCU应用(基于FRDM-KL25Z)
  10. Ios开发之定位CLLocationManager
  11. 小米12 Ultra或将在5月发布:依旧为骁龙8移动平台
  12. Visual Stdio平台工具集以及配置
  13. Windows系统服务相关的端口
  14. 2.性能测试类型或方法
  15. 删除单链表中指针q指向的结点
  16. (11)Redis------分布式锁的实现方式之一(基于Springboot项目搭建)
  17. guass-jordan消元法求逆的原理
  18. 离散数学-自反性-对称性-传递性,关系的性质
  19. 数据分析-数据清洗与整理
  20. 电脑文件夹的展示方式

热门文章

  1. android seekbar 圆角,android - 最小或最大时,圆角android seekbar的ui奇怪行为 - 堆栈内存溢出...
  2. Android XML解析器– XMLPullParser
  3. passwd命令修改密码_Linux passwd命令–更改用户密码
  4. 用gdb来学习c语言(linux环境下)
  5. Java面试题:热情盛夏,分享Java大厂面试百题
  6. Java基础如何运用FileOutputStream
  7. Java基础之字符串详细比较
  8. Codeforces Round #544 (Div. 3) A.Middle of the Contest
  9. 聊聊rocketmq的FileAppender
  10. 从对象创建和引用小议解耦