AutoMapper使用简单总结
近期,在用AutoMapper整理一些模型对象映射,顺便小结一下使用的体会。难免有写得不对的地方,谢谢指出!
1. AutoMapper是一个.NET的对象映射工具,可以方便地进行对象间的赋值处理.
项目地址:https://github.com/AutoMapper/AutoMapper。
帮助文档:https://github.com/AutoMapper/AutoMapper/wiki
2. Demo中使用到的类

public class Order
{
public int Id { get; set; }
public Decimal? TotalAmount { get; set; }
public bool? IsEnable { get; set; } public OrderDetail OrderDetaiEntity { get; set; } public List<ProductDetail> ProductList { get; set; }
} public class OrderDetail
{
public string Remark { get; set; } public DateTime? OrderDate { get; set; }
public string OrderUser { get; set; }
public DateTime? ClosedDate { get; set; } } public class ProductDetail
{
public int? Id { get; set; }
public string ProductName { get; set; }
public Decimal? Price { get; set; }
} public class OrderDto
{
public int Id { get; set; }
public Decimal TotalAmount { get; set; }
public bool IsEnable { get; set; } public string Remark { get; set; } public OrderDetailDto OrderDetaiEntity { get; set; } public List<ProductDetailDto> ProductList { get; set; }
} public class OrderDetailDto
{
public DateTime OrderDate { get; set; }
public string OrderUser { get; set; }
public DateTime? ClosedDate { get; set; }
} public class ProductDetailDto
{
public int? Id { get; set; }
public string ProductName { get; set; }
public Decimal? Price { get; set; }
}

2. 对象映射情况
(1) 属性类型和名称相同的对象之间直接映射
Mapper.CreateMap<ProductDetail, ProductDetailDto>();
ProductDetail product = new ProductDetail(){ //赋值 };
ProductDetailDto productDto = Mapper.Map<ProductDetail,ProductDetailDto>(product);
(2) 对象之间属性转换、属性忽略

Mapper.CreateMap<Order, OrderDto>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.TotalAmount, opt => opt.MapFrom(src => src.TotalAmount ?? 0))
.ForMember(dest => dest.IsEnable, opt => opt.MapFrom(src => src.IsEnable ?? false))
.ForMember(dest => dest.Remark, opt => opt.MapFrom(src => src.OrderDetaiEntity.Remark))
.ForMember(dest => dest.OrderDetaiEntity, opt => opt.Ignore())
.ForMember(dest => dest.ProductList, opt => opt.Ignore());
OrderDto orderDto1 = Mapper.Map<Order, OrderDto>(orderObj);

(3)属性填充固定值
Mapper.CreateMap<OrderDetail, OrderDetailDto>()
.ForMember(dest => dest.OrderDate, opt => opt.UseValue<DateTime>(DateTime.Now));
(4)包含子对象的对象映射,需要先映射子对象

Mapper.CreateMap<OrderDetail, OrderDetailDto>()
.ForMember(dest => dest.OrderDate, opt => opt.UseValue<DateTime>(DateTime.Now));
Mapper.CreateMap<ProductDetail, ProductDetailDto>(); Mapper.CreateMap<Order, OrderDto>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.TotalAmount, opt => opt.MapFrom(src => src.TotalAmount ?? 0))
.ForMember(dest => dest.IsEnable, opt => opt.MapFrom(src => src.IsEnable ?? false))
.ForMember(dest => dest.Remark, opt => opt.MapFrom(src => src.OrderDetaiEntity.Remark));

或者可以这样写

Mapper.CreateMap<ProductDetail, ProductDetailDto>();
var exp = Mapper.CreateMap<Order, OrderDto>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.TotalAmount, opt => opt.MapFrom(src => src.TotalAmount ?? 0))
.ForMember(dest => dest.IsEnable, opt => opt.MapFrom(src => src.IsEnable ?? false))
.ForMember(dest => dest.Remark, opt => opt.MapFrom(src => src.OrderDetaiEntity.Remark));
//映射子对象
exp.ForMember(dest => dest.OrderDetaiEntity, opt => opt.MapFrom(dto => new OrderDetailDto() {
OrderDate = DateTime.Now,
OrderUser = dto.OrderDetaiEntity.OrderUser,
ClosedDate = dto.OrderDetaiEntity.ClosedDate
}));

或者也可以这样写

Mapper.CreateMap<OrderDetail, OrderDetailDto>()
.ForMember(dest => dest.OrderDate, opt => opt.UseValue<DateTime>(DateTime.Now));
Mapper.CreateMap<ProductDetail, ProductDetailDto>(); Mapper.CreateMap<Order, OrderDto>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.TotalAmount, opt => opt.MapFrom(src => src.TotalAmount ?? ))
.ForMember(dest => dest.Remark, opt => opt.Ignore())
.ForMember(dest => dest.IsEnable, opt => opt.Ignore())
//包含多个相同子对象时
.ForMember(dest => dest.OrderDetaiEntity, opt => opt.MapFrom(src =>
Mapper.Map<OrderDetail, OrderDetailDto>(src.OrderDetaiEntity)
));

(5)转化存在的对象

Mapper.CreateMap<OrderDetail, OrderDetailDto>()
.ForMember(dest => dest.OrderDate, opt => opt.UseValue<DateTime>(DateTime.Now));
Mapper.CreateMap<ProductDetail, ProductDetailDto>(); Mapper.CreateMap<Order, OrderDto>()
.ForMember(dest => dest.Id, opt => opt.MapFrom(src => src.Id))
.ForMember(dest => dest.TotalAmount, opt => opt.MapFrom(src => src.TotalAmount ?? 0))
.ForMember(dest => dest.Remark, opt => opt.Ignore())
.ForMember(dest => dest.IsEnable, opt => opt.Ignore()); var orderDto4 = new OrderDto() { Remark = "this is default value.", IsEnable = true };
Mapper.Map<Order, OrderDto>(orderObj, orderDto4);

(6)其他的, 通过自定义转化来实现
如可以实现 TypeConverter, ValueResolver,ValueFormatter 抽象方法.

3.其他说明
(1)检查还有那些规则没有写完整,可以在最后调用下面的方法
AutoMapper.Mapper.AssertConfigurationIsValid();
(2)重新配置映射
Mapper.Reset();
4. 参考网址
http://www.cnblogs.com/ljzforever/archive/2011/12/29/2305500.html
http://www.cnblogs.com/jiguixin/archive/2011/09/19/2181521.html
http://www.cnblogs.com/dudu/archive/2011/12/16/2284828.html
5. Demo下载
AutoMapper使用简单总结的更多相关文章
- OOM AutoMapper的简单实用
OOM AutoMapper的简单实用 一.前言: OOM顾名思义,Object-Object-Mapping实体间相互转换,AutoMapper也是个老生常谈了,其意义在于帮助你无需手动的转换简单 ...
- AutoMapper的简单使用
接触AutoMapper已经有两年多的时间了,在ORM框架中,它使持久层对象与DTO对象之间的转换变得相当简单. 随着负责的项目的增多,使用的技术框架一多起来,很多具体的技术点难免记不清, 加上同时兼 ...
- automapper的简单用法
AutoMapper对象转换方面(Object-Object Mapping)对象映射工具,实现对象和对象之间的转化.主要应用在项目的dto,model,entity或viewmodel之间转换,其实 ...
- C# AutoMapper的简单扩展
AutoMapper可以很方便的将一个实体的属性值转化给另一个对象.这个功能在我们日常的编码中经常会遇到.我将AutoMapper的一些基本映射功能做成扩展方法,在编码中更方便使用. using Sy ...
- AutoMapper 的简单使用
var config = new MapperConfiguration( cfg => cfg.CreateMap<SYS_Menu, MenuTreeNode>() .ForMe ...
- ADO.NET .net core2.0添加json文件并转化成类注入控制器使用 简单了解 iTextSharp实现HTML to PDF ASP.NET MVC 中 Autofac依赖注入DI 控制反转IOC 了解一下 C# AutoMapper 了解一下
ADO.NET 一.ADO.NET概要 ADO.NET是.NET框架中的重要组件,主要用于完成C#应用程序访问数据库 二.ADO.NET的组成 ①System.Data → DataTable, ...
- AutoMapper搬运工之自定义映射
回顾 上节说到了AutoMapper的简单使用,对于复杂的Mapping需要强大的自定义,这节我们来看下AutoMapper的自定义Mapping(Projection) 搬运自Git:https:/ ...
- AutoMapper搬运工之初探AutoMapper
写在前面 知道AutoMapper很久了,但是一直没有用,最近刚好有个场景需要就用了,果然是利器.看了git上的wiki,发现内容其实wiki上写的很全面了,深入的暂时还没挖掘到.不过和群里的朋友交流 ...
- AutoMapper用法(转载)
申明 本文转载自http://www.qeefee.com/article/automapper 作者:齐飞 配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前,我 ...
随机推荐
- Shell脚本中让进程休眠的方法(sleep用法)
有时候写Shell的脚本,用于顺序执行一系列的程序. 有些程序在停止之后并没能立即退出,就例如有一个 tomcat 挂了,就算是用 kill -9 命令也还没瞬间就结束掉. 这么如果 shell 还没 ...
- ubuntu12.10下OpenFoam的编译
最近在ubuntu12.10下编译OpenFoam,遇到一些问题,小记一下. 首先到官网下载源码包(我这里下载的是OpenFOAM-2.3.0.tgz,ThirdParty-2.3.0.tgz). 1 ...
- sqlserver 经典入门基础书籍
1.SQLServer2005T-SQL数据库设计 作者:胡百敬等著 ISBN:10位[7121053632]13位[9787121053634] 出版社:电子工业出版社 出版日期:2008-1-1 ...
- Logistic Regression 模型简介
逻辑回归(Logistic Regression)是机器学习中的一种分类模型,由于算法的简单和高效,在实际中应用非常广泛.本文作为美团机器学习InAction系列中的一篇, 主要关注逻辑回归算法的数学 ...
- allegro 导Gerber文件
今天抽空好好整理了一下有关Allegro出Gerber文件文档,此文档在网上搜到的基础上进一步完善,把每个需要注意的地方都用红色字体框出 http://files.cnblogs.com/files/ ...
- hdu_5676_ztr loves lucky numbers
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=5676 在这%一下安神,用了我没见过的黑科技next_permutation,至少我是今天才知道的 #i ...
- hdu_4823_Energy Conversion
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=4823 题意:中文题,很清楚,要注意的是乘起来会爆int 题解: #include<cstdio& ...
- H5之重力感应篇
手机的重力感应支持里,有两个主要的事件: 1. OrientationChange (在屏幕发生翻转的时候触发) 2. DeviceOrientation+DeviceMotion(重力感应与陀螺仪) ...
- myeclipse8.6安装svn插件
1.从官方网站下载site-1.6.16.zip,网址:subclipse.tigris.org: 2.将解压出来的features与plugins,复制到任意目录:Genuitec/MyEclips ...
- 传统 Ajax 已死,Fetch 永生
原谅我做一次标题党,Ajax 不会死,传统 Ajax 指的是 XMLHttpRequest(XHR),未来现在已被 Fetch 替代. 最近把阿里一个千万级 PV 的数据产品全部由 jQuery 的 ...