AutoMapper搬运工之初探AutoMapper

摘要:
写在前面知道AutoMapper很久了,但是一直没有用,最近刚好有个场景需要就用了,果然是利器。AutoMapper是一个完善的Mapping工具,所谓Mapping即数据对象转换,借用群里朋友的话是多用于领域对象和DTO对象的Mapping或者是SqlDataReader的Mapping。AutoMapper的简单默认Mapping规则1.针对复杂对象到简单对象的映射,Mapping遵循驼峰命名的规则,即当目标dto属性名称在源对象中找不到时,AutoMapper会根据驼峰命名规则拆分dto属性名去寻找相应的关系。

写在前面

知道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对象中:

AutoMapper搬运工之初探AutoMapper第1张AutoMapper搬运工之初探AutoMapper第2张
1 public classOrder
2 {
3   private readonly IList<OrderLineItem> _orderLineItems = new List<OrderLineItem>();
4 
5   public Customer Customer { get; set; }
6 
7   publicOrderLineItem[] GetOrderLineItems()
8 {
9     return_orderLineItems.ToArray();
10 }
11 
12   public void AddOrderLineItem(Product product, intquantity)
13 {
14     _orderLineItems.Add(newOrderLineItem(product, quantity));
15 }
16 
17   public decimalGetTotal()
18 {
19     return _orderLineItems.Sum(li =>li.GetTotal());
20 }
21 }
22 }
23 
24 public classOrderLineItem
25 {
26   public OrderLineItem(Product product, intquantity)
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 decimalGetTotal()
36 {
37     return Quantity*Product.Price;
38 }
39 }
40 
41 public classCustomer
42 {
43   public string Name { get; set; }
44 }
45 
46 public classProduct
47 {
48   public decimal Price { get; set; }
49   public string Name { get; set; }
50 }
View Code

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

AutoMapper搬运工之初探AutoMapper第3张AutoMapper搬运工之初探AutoMapper第4张
public classOrderDto
{
    public string CustomerName { get; set; }
    public decimal Total { get; set; }
}
View Code

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

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

//定义一个order
var customer = newCustomer
{
    Name = "George Costanza";
}
var order = newOrder
{
    Customer =customer;
}
var bosco = newProduct
{
    Name = "Bosco",
    Price = 4.99m;
}
order.AddOrderLineItem(bosco, 15);

//转换
var dto = newOrderDto();
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之自定义映射》里,我会为大家搬运。有啥疑问和意见可以给我留言,咱们来探讨一番,请大拿不吝赐教~!

免责声明:文章转载自《AutoMapper搬运工之初探AutoMapper》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Android adb 模拟滑动 按键 点击事件2020系统综合实践 第7次实践作业 11组下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

.NET5 ABP框架(一)

https://aspnetboilerplate.com/ https://github.com/aspnetboilerplate/aspnetboilerplate https://aspnetboilerplate.com/Pages/Documents/Zero/Startup-Template-Core 框架特点 依赖注入 - ABP提供了...

Asp.net 面向接口可扩展框架之使用“类型转化基础服务”测试四种Mapper(AutoMapper、EmitMapper、NLiteMapper及TinyMapper)

Asp.net 面向接口可扩展框架的“类型转化基础服务”是我认为除了“核心容器”之外最为重要的组成部分 但是前面博文一出,争议很多,为此我再写一篇类型转化基础服务和各种Mapper结合的例子,顺便对各种Mapper做个简单的优缺点对比 我对第三方组件评介有三个标准,一、可用性,二、性能,三、易用性 本例子中四种Mapper以前我都没使用过(因为以前我都用自...

AutoMapper小结

一些orm框架,在用到Entity的时候有一些开源代码用到了automapper(如:nopcommence),将数据对象转成DTO。比如在ORM中,与数据库交互用的Model模型是具有很多属性变量方法神马的。而当我们与其它系统(或系统中的其它结构)进行数据交互时,出于耦合性考虑或者安全性考虑或者性能考虑(总之就是各种考虑),我们不希望直接将这个Model...

c# AutoMapper 扩展

下面直接上代码 扩展方法 public static class Ext { #region 对象或集合,字段不一致 自定义转换规则 Mapping /// <summary> /// 集合列表类型映射,默认字段名字一一对应 /// </summary>...

AutoMapper

扩展方法 /// <summary> /// 类型映射,默认字段名字一一对应 /// </summary> /// <typeparam name="TDestination">转化之后的model,可以理解为viewmodel</typeparam>...

AutoMapper之ABP项目中的使用介绍

最近在研究ABP项目,昨天写了Castle Windsor常用介绍以及其在ABP项目的应用介绍 欢迎各位拍砖,有关ABP的介绍请看阳光铭睿 博客 AutoMapper只要用来数据转换,在园里已经有很多这方面文章了,本文主要介绍其在实际项目常用总结,以及在ABP项目中的应用介绍。AutoMapper应用非常简单,大家稍微看下文档就可以上手,但是性能不好啊,所...