AutoMapper搬运工之初探AutoMapper

写在前面

知道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 }

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

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

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

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

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

时间: 2024-10-14 15:23:34

AutoMapper搬运工之初探AutoMapper的相关文章

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

前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NET高级开发,坐标上海,有兴趣的给我留言,或者加我qq:1029183866,加的时候请说明博客园看到. 另外在说说这几天,工作忙是不可避免,业余也在准备自己的网站www.capqueen.com(目前还在备案中),准备用目前会的技术从无到有建立一个CMS(博客),到时候也会发一些文章和大家分享.最近

AutoMapper搬运工之配置

回顾 前几篇搬运了AutoMapper的基本用法,自定义映射,相信有看的同学已经会使用AutoMapper这个强大的Mapping工具了.不过细心的你是否还记得前几篇中有提到Map的创建并非是每次都需要Create,那么AutoMapper对于这些如果管理呢?这篇我们就要来看看AutoMapper的配置. 初始化 AutoMapper提供一个初始化函数(Mapper.Initialize),可以在程序初始化时调用(Web应用程序可以在Global.asax里写),进行统一的配置初始化.前几个章节

AutoMapper搬运工之自定义映射

回顾 上节说到了AutoMapper的简单使用,对于复杂的Mapping需要强大的自定义,这节我们来看下AutoMapper的自定义Mapping(Projection) 搬运自Git:https://github.com/AutoMapper/AutoMapper/wiki/Projection 实例 本篇的场景是一个简单的日历事件,我们首先定义一个日历的事件如下: 1 public class CalendarEvent 2 { 3 //事件日期 4 public DateTime Date

无名小卒AutoMapper的大显神威

最近在做gxpt(高校平台的项目),前台框架用的是MVC,后台用的是EF+WCF.怎么突然说出来感觉很高大上的样子.呵呵!但是在写代码的时候就发现一个问题.就是在EF中的实体(Model)跟前台需要的实体(DTO数据传输对象)是不一样的,所以就需要转换一下.一开始也没多想,可能是被做项目的热情冲昏了头脑,写多少代码都不觉得类,所以每当需要转换的时候就一个一个的写!给大家看一个例子! <span style="font-size:18px;">namespace testau

AutoMapper Getting started

AutoMapper 是什么? 为什么要用AutoMapper? 如何使用AutoMapper? 在什么地方配置AutoMapper? 如何测试my mappings? AutoMapper 是什么? AutoMapper是一个对象到对象的映射关系,对象到对象的映射是通过转化一个类型对象输入到一个不同的类型对象输出来工作的,使得AutoMapper让人感兴趣的一点就是他提供了一些比较有趣的规则把繁重的工作从类型对象转换算法中剔除掉, 只要类型对象遵循了AutoMapper建立的规则,基本上不需要

AutoMapper.EF6

https://github.com/AutoMapper/AutoMapper.EF6 Extensions for AutoMapper and EF6 This contains some useful extensions I've used with AutoMapper and EF6. Instead of this: Mapper.CreateMap<Employee, EmployeeDto>() .ForMember(d => d.FullName, opt =>

【AutoMapper官方文档】DTO与Domin Model相互转换(中)

写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) 持续更新中... 本篇目录: Custom Type Converters-自定义类型转换器 Custom Value Resolvers-自定义值解析器 Null Substitution-空值替换 Containers-IoC容器 后记 随着AutoMapper的学习深入,发现AutoMapper在对

AutoMapper使用

AutoMapper使用 前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Client端引用Domain Model就意味着Client端可以绕过应用层直接完成业务逻辑的调用,这样是一种不安全的机制. 从对象传递效率上面考虑,领域Model带有业务,而这些业务一般对于UI层是没有意义的,所以带有业务的model传递起来会加重网络负担. 网上还说了DT

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

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