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是基于约定的,因此在实用映射之前,我 ...
随机推荐
- json 与entity/list/map的转换
一 json -> entity User.java package com.xxx.hotel.train.json.json2entity; import java.io.Serializ ...
- CSS 各类 块级元素 行级元素 水平 垂直 居中问题
元素的居中问题是每个初学者碰到的第一个大问题,在此我总结了下各种块级 行级 水平 垂直 的居中方法,并尽量给出代码实例. 首先请先明白块级元素和行级元素的区别 行级元素 一块级元素 1 水平居中: ( ...
- JMeter基础
转载自虫师-http://www.cnblogs.com/fnng/archive/2012/12/21/2828440.html JMeter 介绍: 一个非常优秀的开源的性能测试工具. 优点:你用 ...
- php中文乱码问题分析及解决办法
中文乱码问题产生的原因,主要就是字符编码设置问题: 首先,mysql数据库安装的时候字符编码要选择正确,最好选择utf-8比较保险.如果安装时没有设置正确,找到mysql的安装 ...
- iosOC可变数组选择,冒泡排序
#pragma mark 可变数组的排序 NSMutableArray * array = [NSMutableArray arrayWithObjects: @"1",@&quo ...
- c语言_头文件_stdlib
简介 stdlib 头文件即standard library标准库头文件 stdlib 头文件里包含了C.C++语言的最常用的系统函数 该文件包含了C语言标准库函数的定义 stdlib.h里面定义了五 ...
- C语言-字符串文本串联
要形成包含多个行的字符串,可以串联两个字符串. 为此,请键入正斜杠,然后按 return 键. 反斜杠导致编译器忽略以下换行符. 例如,字符串 "Long strings can b ...
- cmd命令行
拷贝
- Robotium第一天:搭建环境测试微信
因为要在命令行下运行一些android的工具,所以配置一些环境变量会比较方便: 遇到问题: java -jar re-sign.jar 出现提示android路径没有配置好: 需要配置如下: 配置AN ...
- 二分法习题HDU2199
AC代码 : #include<iostream>#include<cmath>using namespace std;double y;double f(double n){ ...