回顾

上节说到了AutoMapper的简单使用,对于复杂的Mapping需要强大的自定义,这节我们来看下AutoMapper的自定义Mapping(Projection)

搬运自Git:https://github.com/AutoMapper/AutoMapper/wiki/Projection

实例

本篇的场景是一个简单的日历事件,我们首先定义一个日历的事件如下:

 public class CalendarEvent
{
//事件日期
public DateTime Date { get; set; }
//事件标题
public string Title { get; set; }
}

那么在页面,我们需要显示这个事件的具体信息,而且是可编辑的,定义一个ViewModel dto如下:

 public class CalendarEventForm
{
//事件日期
public DateTime EventDate { get; set; }
//时间对应的小时
public int EventHour { get; set; }
//时间对应的分钟
public int EventMinute { get; set; }
//事件标题
public string Title { get; set; }
}

也许你会小小的纠结下,为啥要这么定义,页面上js直接转换之类的,好吧,这就是一个例子,你明白就好。

接下来和本系列一贯的做法一样,我们来看下手写Mapping的方式:

 // 定义一个日历事件
var calendarEvent = new CalendarEvent
{
Date = new DateTime(, , , , , ),
Title = "公司聚会"
}; CalendarEventForm form = new CalendarEventForm
{
EventDate = calendarEvent.Date.Date,
EventHour = calendarEvent.Date.Hour,
EventMinute = calendarEvent.Date.Minute,
Title = calendarEvent.Title
};

这个Mapping依然很简单,没什么疑问,咱们来对比下使用AutoMapper:

 // 配置Mapping
Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
.ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date))
.ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour))
.ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute)); //Mapping
CalendarEventForm form = Mapper.Map<CalendarEvent, CalendarEventForm>(calendarEvent);

有什么感想?是不是感觉代码高大上,但是跟手写的没啥区别,哈哈,别着急,这只是一个例子。对于复杂的场景,你自然会体会到AutoMapper使代码简洁,配置统一。

说道配置这里需要说明一下:Mapping的配置并不是这样每次都要Create的,具体的说明,请期待下篇 《AutoMapper之配置》

回到上面的代码,我们来进一步的说明下这个ForMember

ForMember函数

AutoMapper提供了相关的API来支持自定义的Mapping配置,并且他支持lamda哦。

看一下ForMember的定义:

IMappingExpression<TSource, TDestination> ForMember(Expression<Func<TDestination, object>> destinationMember

第一个参数是目标属性,第二个参数是一定义的映射Expression, Expression让这个映射变得更加的动态,可以直接使用表达式或者干脆直接来个函数调用:

 .ForMember(dest => dest.Title, opt => opt.MapFrom(src => ChangeTitle(src.Title));//调用方法
.ForMember(dest => dest.Title, opt => opt.MapForm(src => src.Title.Where(....);//表达式 string ChangeTitle(string title)
{
//自定义处理
... return "myName" + title;
}

有关Expression的内容及构造请参考表达式的文章,这里边的水很深,有机会我也去深入研究分享些内容。

细心的你或许会发现,如果映射写了多个会怎么样?经过测试,结论是:只有第一个配置是有效的,之后的同参数映射AutoMapper会自动忽略。

另外,还有一个ForMembers函数不过并不是很常用,其他的函数请自行研究,如果我有研究使用后面的系列我会一一分享。本节仍然是简单的内容,如果大家有更好的建议请留言,我觉得可能搬运的太简单,没有给人具体的映象的感觉。

AutoMapper搬运工之自定义映射的更多相关文章

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

    前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NE ...

  2. AutoMapper搬运工之配置

    回顾 前几篇搬运了AutoMapper的基本用法,自定义映射,相信有看的同学已经会使用AutoMapper这个强大的Mapping工具了.不过细心的你是否还记得前几篇中有提到Map的创建并非是每次都需 ...

  3. AutoMapper搬运工之初探AutoMapper

    写在前面 知道AutoMapper很久了,但是一直没有用,最近刚好有个场景需要就用了,果然是利器.看了git上的wiki,发现内容其实wiki上写的很全面了,深入的暂时还没挖掘到.不过和群里的朋友交流 ...

  4. AutoMapper指定列名进行映射

    有了AutoMapper,就再也不用进行手工一对一的从IDataReader到实体字段的赋值.这篇博文是一个实际案例的记录. 实体类型定义如下: public class UploadImage { ...

  5. MyBatis的类型自定义映射

    背景 利用MyBatis将数据库的时间类型映射成Java8的时间类型,引申对不同类型的自定义映射 实现方法 1.实现MyBatis中TypeHandler接口 @MappedTypes(value = ...

  6. 学习windows编程 day4 之 自定义映射

    LRESULT CALLBACK WndProc(HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam) { HDC hdc; PAINTSTRU ...

  7. Elasticsearch 自定义映射

    尽管在很多情况下基本域数据类型 已经够用,但你经常需要为单独域自定义映射 ,特别是字符串域.自定义映射允许你执行下面的操作: 全文字符串域和精确值字符串域的区别 使用特定语言分析器 优化域以适应部分匹 ...

  8. NetCore+AutoMapper多个对象映射到一个Dto对象

    目录 一. 定义源映射类和被映射类DTO二.注入AutoMapper三.配置映射四.写测试 一.定义源映射对象 为了体现AutoMapper映射特性,在SocialAttribute中的Name属性没 ...

  9. resultMap自定义映射(多对一)

    自定义resultMap,处理复杂的表关系,实现高级结果集映射 1) id :用于完成主键值的映射 2) result :用于完成普通列的映射 3) association :一个复杂的类型关联;许多 ...

随机推荐

  1. HCTF时PHP WAF然有RLFI漏洞

    tips:from菜鸡队长 这次去打HCTF决赛,用了这个自己写的WAF,web基本上没被打,被打的漏洞是文件包含漏洞,这个功能在本人这个waf里确实很是捉急,由于只是简单检测了..和php[35]{ ...

  2. Google Map API V3开发(1)

    Google Map API V3开发(1) Google Map API V3开发(2) Google Map API V3开发(3) Google Map API V3开发(4) Google M ...

  3. windows系统在python3.5环境下安装mysql组件

    折腾了一个多小时,终于把连接Mysql的模块装好了,由于我的环境是python3.5,Mysql官方支持到python3.4,后面google查到有pymysql模快支持python3.5,这个模块是 ...

  4. 浅谈Android下的Bitmap之大Bitmap加载

    引言 我们常常提到的“Android程序优化”,通常指的是性能和内存的优化,即:更快的响应速度,更低的内存占用.Android程序的性能和内存问题,大部分都和图片紧密相关,而图片的加载在很多情况下很用 ...

  5. IOS热更新-JSPatch实现原理+Patch现场恢复

    关于HotfixPatch 在IOS开发领域,由于Apple严格的审核标准和低效率,IOS应用的发版速度极慢,稍微大型的app发版基本上都在一个月以上,所以代码热更新(HotfixPatch)对于IO ...

  6. NGUI 学习笔记

    1.NGUI中UI的深度关系(新版NGUI 3.9): 在同一个Panel中,不管同不同Altas,各个UI的顺序受Depth影响 在不同Panel中,UI的顺序受Panel的Depth影响 例如Pa ...

  7. Raid与DAN、SAN、NAS基础

    一. 磁盘基本知识 1. Raid分类 Raid磁盘阵列是由多个磁盘组合成的磁盘组,可将数据分割成许多区段,分别存放在各个磁盘上:同时利用不同排列技术,可提高磁盘性能和数据安全性.下列简单介绍几种Ra ...

  8. R语言——七月

    这两个月没有写什么代码.也没做什么大项目,基本就是对以前写的那个用ggplot2可视化数据的项目做一些增增补补,大部分技术难关都在ggplot2和R语言EXCEL处理这里解决并总结了.然后业余帮人修改 ...

  9. PHP 的异常处理、错误处理:error_reporting,try-catch,trigger_error,set_error_handler,set_exception_handler,register_shutdown_function

    一.错误.异常 等级常量表 error:不能在编译期发现的运行期错误,比如试图用 echo 输出一个未赋值的变量,这类问题往往导致程序或逻辑无法继续下去而需要中断: exception:程序执行过程中 ...

  10. Ubuntu 12/14 个性化配置

    计算机名:jianbao-pc    用户名:jianbao 修改 /opt目录的 用户名 及 用户组 : sudo chown -R jianbao:jianbao /opt Ubuntu 如何开启 ...