博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
AutoMapper搬运工之自定义映射
阅读量:4948 次
发布时间:2019-06-11

本文共 2522 字,大约阅读时间需要 8 分钟。

回顾

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

搬运自Git:

 

 

实例

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

1 public class CalendarEvent2 {3     //事件日期  4     public DateTime Date { get; set; }5     //事件标题     6     public string Title { get; set; }7 }

 

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

1 public class CalendarEventForm 2 { 3     //事件日期 4     public DateTime EventDate { get; set; } 5     //时间对应的小时 6     public int EventHour { get; set; } 7     //时间对应的分钟 8     public int EventMinute { get; set; } 9     //事件标题10     public string Title { get; set; }11 }

 

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

 

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

1 // 定义一个日历事件 2 var calendarEvent = new CalendarEvent 3 { 4     Date = new DateTime(2014, 12, 15, 20, 30, 0), 5     Title = "公司聚会" 6 }; 7  8 CalendarEventForm form = new CalendarEventForm 9 {10     EventDate = calendarEvent.Date.Date,11     EventHour =  calendarEvent.Date.Hour,12     EventMinute = calendarEvent.Date.Minute,13     Title = calendarEvent.Title  14 };

 

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

1 // 配置Mapping2 Mapper.CreateMap
()3 .ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.Date.Date))4 .ForMember(dest => dest.EventHour, opt => opt.MapFrom(src => src.Date.Hour))5 .ForMember(dest => dest.EventMinute, opt => opt.MapFrom(src => src.Date.Minute));6 7 //Mapping8 CalendarEventForm form = Mapper.Map
(calendarEvent);

 

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

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

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

 

ForMember函数

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

看一下ForMember的定义:

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

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

1 .ForMember(dest => dest.Title, opt => opt.MapFrom(src => ChangeTitle(src.Title));//调用方法 2 .ForMember(dest => dest.Title, opt => opt.MapForm(src => src.Title.Where(....);//表达式 3  4 string ChangeTitle(string title) 5 { 6     //自定义处理 7     ... 8      9     return "myName" + title;  10 }

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

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

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

转载于:https://www.cnblogs.com/capqueen/p/AutoMapperProjectionOne.html

你可能感兴趣的文章
8.1 Android Basic 数据存储 Preferences Structured(分组的Preferences)
查看>>
原因和证明
查看>>
VC6.0图像处理2--图像的反色
查看>>
Snoop, 对WPF程序有效的SPY++机制
查看>>
Does not contain a valid host;port authority解决方法
查看>>
JAVA程序猿怎么才干高速查找到学习资料?
查看>>
使用axel下载百度云文件
查看>>
Qt中图像的显示与基本操作
查看>>
详解软件工程之软件测试
查看>>
WCF(二) 使用配置文件实现WCF应用程序
查看>>
【CodeForces 803 C】Maximal GCD(GCD+思维)
查看>>
python 去掉换行符或者改为其他方式结尾的方法(end='')
查看>>
数据模型(LP32 ILP32 LP64 LLP64 ILP64 )
查看>>
REST构架风格介绍:状态表述转移
查看>>
struct {0}初始化
查看>>
c++ operator
查看>>
apache 添加 ssl_module
查看>>
java小技巧
查看>>
POJ 3204 Ikki's Story I - Road Reconstruction
查看>>
getQueryString
查看>>