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是基于约定的,因此在实用映射之前,我 ...
随机推荐
- mysql表备份及还原
备份 导出数据库所有表结构 ? 1 mysqldump -uroot -ppassword -d dbname > db.sql 导出数据库某个表结构 ? 1 mysqldump -uroot ...
- Redis简介四
一..NET使用Redis 和MongoDB一样,在.NET中使用Redis其实也是使用第三方驱动,官网推荐的是使用ServiceStack.Redis(https://github.com/Serv ...
- javascript 如何正确使用getElementById,getElementsByName(), and getElementsByTagName()
WEB标准下可以通过getElementById(), getElementsByName(), and getElementsByTagName()访问DOCUMENT中的任一个标签. (1)get ...
- hdu_3067_小t的游戏(脑洞)
题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3067 题意:中文,不解释 题解:一看就知道是要找规律的题,都是有循环节的,看代码. #include ...
- 利用DataImportHandler建索引时一直无法完成
问题研究 项目中需要利用DataImportHandler从hive中sync数据到solr.发现有时候hive sql已经执行完几个小时了,sync任务还没有完成,貌似哪里卡住了.重启solr后重新 ...
- LeetCode OJ 113. Path Sum II
Given a binary tree and a sum, find all root-to-leaf paths where each path's sum equals the given su ...
- hdu 1166 敌兵布阵(线段树详解)
Problem Description C国的死对头A国这段时间正在进行军事演习,所以C国间谍头子Derek和他手下Tidy又开始忙乎了.A国在海岸线沿直线布置了N个工兵营地,Derek和Tidy的任 ...
- Shell:进程的层级关系
[luwenwei@appdev115 ~]$ ps -ef | grep initroot 1 0 0 Apr24 ? 00:08:25 init [3] [luwenwei@appdev115 ~ ...
- IBM Mq Spring JMS 的xml配置
<?xml version="1.0" encoding="UTF-8"?><beans xmlns="http://www.spr ...
- virtualenv 管理python 环境
virualenvvirtualenv用于创建独立的Python环境,多个Python相互独立,互不影响,它能够:1. 在没有权限的情况下安装新套件2. 不同应用可以使用不同的套件版本3. 套件升级不 ...