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对象中:
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 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; }
} public class Product
{
public decimal Price { get; set; }
public string Name { get; set; }
}
然后在页面上我需要展示一些数据,为了保持页面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, ); //转换
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之自定义映射》里,我会为大家搬运。有啥疑问和意见可以给我留言,咱们来探讨一番,请大拿不吝赐教~!
AutoMapper搬运工之初探AutoMapper的更多相关文章
- AutoMapper搬运工之自定义类型转换
前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NE ...
- AutoMapper搬运工之配置
回顾 前几篇搬运了AutoMapper的基本用法,自定义映射,相信有看的同学已经会使用AutoMapper这个强大的Mapping工具了.不过细心的你是否还记得前几篇中有提到Map的创建并非是每次都需 ...
- TransactionScope事务处理方法介绍及.NET Core中的注意事项 SQL Server数据库漏洞评估了解一下 预热ASP.NET MVC 的VIEW [AUTOMAPPER]反射自动注册AUTOMAPPER PROFILE
TransactionScope事务处理方法介绍及.NET Core中的注意事项 作者:依乐祝 原文链接:https://www.cnblogs.com/yilezhu/p/10170712.ht ...
- AutoMapper搬运工之自定义映射
回顾 上节说到了AutoMapper的简单使用,对于复杂的Mapping需要强大的自定义,这节我们来看下AutoMapper的自定义Mapping(Projection) 搬运自Git:https:/ ...
- [AutoMapper]反射自动注册AutoMapper Profile
AutoMapper 帮我我们方便管理物件跟物件之间属性值格式转换 模型转换 这里有两个类别 UserInfoModel 当作我们从DB捞取出来模型资料 public class UserInfoMo ...
- C#进阶系列——DDD领域驱动设计初探(五):AutoMapper使用
前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...
- DDD领域驱动设计初探(五):AutoMapper使用
前言:前篇搭建了下WCF的代码,就提到了DTO的概念,对于为什么要有这么一个DTO的对象,上章可能对于这点不太详尽,在此不厌其烦再来提提它的作用: 从安全上面考虑,领域Model都带有领域业务,让Cl ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(上)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
- 【AutoMapper官方文档】DTO与Domin Model相互转换(中)
写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) [Au ...
随机推荐
- android开发之线程
线程(android) 在java中我们学习了线程,线程,是进程的一个单位,在程序要运行时,会开启线程,运行程序,我们要创建线程就需要我们去继承接口Thread或者实现Runabl ...
- WKWebView与JS交互,UIWebView+JavascriptCore和JS交互
最近一直在做有关Swift和JavaScript交互的程序,所以有关UIWebView和WKWebView在使用上的差别在此总结下: UIWebView: (1)创建 var webView: UIW ...
- SDWebImage使用及原理
第一步,下载SDWebImage,导入工程.github托管地址https://github.com/rs/SDWebImage 第二步,在需要的地方导入头文件 1 #import "UII ...
- BZOJ4570: [Scoi2016]妖怪
题目传送门 4570: [Scoi2016]妖怪 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 491 Solved: 125 [Submit][Sta ...
- Python学习笔记——迭代器(RandSeq和AnyIter)
1.RandSeq #coding:utf-8 #!/usr/bin/env python 'randSeq.py -- 迭代' #从random模块里仅仅导入choice方法 from random ...
- 高版本api在低版本中的兼容
直接上例子,看如何避免crash. eg:根据给出路径,获取此路径所在分区的总空间大小. 文档说明:获取文件系统用量情况,在API level 9及其以上的系统,可直接调用File对象的相关方法,以下 ...
- redis3.2 最新版本启动配置文件redis.conf详细说明
Redis.conf文件内容详细说明: # 默认redis不是以后台进程的方式启动,如果需要在后台运行,需要将这个值设置成yes # 以后台方式启动的时候,redis会写入默认的进程文件/var/ru ...
- 前端工具之Gulp
Gulp是一款前端自动化的工具,如果能熟练使用Gulp来进行开发一定可以节省很多的时间,也可以快速的提高工作效率. 在使用Gulp之前就是要配置好Gulp安装的环境,这是我们能使用Gulp快速开发的第 ...
- CSS3 时钟
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- Coursera系列-R Programming第三周-词法作用域
完成R Programming第三周 这周作业有点绕,更多地是通过一个缓存逆矩阵的案例,向我们示范[词法作用域 Lexical Scopping]的功效.但是作业里给出的函数有点绕口,花费了我们蛮多心 ...