AutoMapper搬运工之配置

回顾

前几篇搬运了AutoMapper的基本用法,自定义映射,相信有看的同学已经会使用AutoMapper这个强大的Mapping工具了。不过细心的你是否还记得前几篇中有提到Map的创建并非是每次都需要Create,那么AutoMapper对于这些如果管理呢?这篇我们就要来看看AutoMapper的配置。

初始化

AutoMapper提供一个初始化函数(Mapper.Initialize),可以在程序初始化时调用(Web应用程序可以在Global.asax里写),进行统一的配置初始化。前几个章节的CreateMap就可以统一写到此处,如下:

1 Mapper.Initialize(cfg => {
2     Mapper.CreateMap<CalendarEvent, CalendarEventForm>()
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 });

OK,是不是很方便,那么问题来了,cfg是个什么东西?这里根本没用嘛?

当然不是这样的,Config里的配置还有很多的,只不过这篇我们就讲如何统一处理CreateMap,其他配置可以自己敲代码看一下,如果有问题,也可以留言交流下。后面的章节里会逐个讲。

那么本篇就结束了么?没有,细心的你会不会觉得在Global.asax里写这么多CreateMap严重影响了代码的美观和可维护性。如果写到外面去处理那不是更方便。当然,强大的AutoMapper已经为你想好了,不过显然这里其实也可以自己单独写一个方法来处理。

配置文件 (Profile)

如果熟悉windows的网络配置netsh wlan profile的同学肯定对Profile的概念不陌生,简单的说就是按照AutoMapper的规范单独的制定了一个格式的文件,在该文件中可以预定于一些AutoMapper的配置,用于统一分门别类的管理好我们在使用AutoMapper时需要的配置。

一个标准的AutoMapper配置文件是这样子的:

 1 public class OrganizationProfile : Profile
 2 {
 3     protected override void Configure()
 4     {
 5         //将CreateMap放到此处
 6     }
 7
 8     //配置的名称,默认可以定义为当前的类名
 9     public override string ProfileName
10     {
11         get { return this.GetType().Name; }
12     }
13 }    

定义好了配置文件,只需要在AutoMapper初始化时添加即可:

1 Mapper.Initialize(cfg => {
2
3     cfg.AddProfile<OrganizationProfile>();
4 });

如果你觉得配置文件就只有这么简单的功能的话,那么就错了,Profile还有更强大的功能,那就是每个Profile里创建的Map可以单独配置Mapping的一些规则,例如:

public class OrganizationProfile : Profile
{
    protected override void Configure()
    {
        //Mapper.CreateMap写到此处... Etc.. here
        SourceMemberNamingConvention = new LowerUnderscoreNamingConvention();
        DestinationMemberNamingConvention = new PascalCaseNamingConvention();
    }
}    

SourceMemberNamingConvention指的是源对象的属性匹配规则,即默认的是propertyName -> propertyName的转换,这里设置了一个带下划线的匹配LowerUnderscoreNamingConvention, 即property_name -> PropertyName

DestinationMemberNamingConvention指的是目标对象的属性匹配规则,这里的PascalCaseNamingConvention指的是按照Pascal驼峰命名规则来处理。这两个处理Convention是AutoMapper已经提供的,如果需要自定义更强大的Convention那么,请期待下节:《AutoMapper搬运工之自定义转换规则》

以上文章搬运自:https://github.com/AutoMapper/AutoMapper/wiki/Configuration

另外参考文章:http://consultingblogs.emc.com/owainwragg/archive/2010/12/15/automapper-profiles.aspx

如有不对的地方请指教,如果觉得好,请点推荐,感激不尽~

时间: 2024-10-31 09:31:20

AutoMapper搬运工之配置的相关文章

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

前言 最近还挺忙,还有点累,一直都没更新了,实在是懒呀.正题之前先说点别的,最近公司要扩张了,需要大量开发,领导说推荐有钱可以拿,如此好机会,我就趁机做个广告.ShippingRen.com招募.NET高级开发,坐标上海,有兴趣的给我留言,或者加我qq:1029183866,加的时候请说明博客园看到. 另外在说说这几天,工作忙是不可避免,业余也在准备自己的网站www.capqueen.com(目前还在备案中),准备用目前会的技术从无到有建立一个CMS(博客),到时候也会发一些文章和大家分享.最近

AutoMapper搬运工之自定义映射

回顾 上节说到了AutoMapper的简单使用,对于复杂的Mapping需要强大的自定义,这节我们来看下AutoMapper的自定义Mapping(Projection) 搬运自Git:https://github.com/AutoMapper/AutoMapper/wiki/Projection 实例 本篇的场景是一个简单的日历事件,我们首先定义一个日历的事件如下: 1 public class CalendarEvent 2 { 3 //事件日期 4 public DateTime Date

automapper如何全局配置map条件过滤null值空值对所有映射起效

原文 automapper如何全局配置map条件过滤null值空值对所有映射起效 我们在使用automapper的时候经常会遇到这样的问题:假设展示给用户的数据我们用UserDto类,User类就是我们的实体类.在给用户编辑的时候,我们可能某些字段在数据库中为Null,这时候需要一些默认值 比如这里UserDto中的BirTime,然后我们有一些人的习惯是在构造函数里面进行赋值 public class User { public int Id { get; set; } public stri

AutoMapper搬运工之初探AutoMapper

写在前面 知道AutoMapper很久了,但是一直没有用,最近刚好有个场景需要就用了,果然是利器.看了git上的wiki,发现内容其实wiki上写的很全面了,深入的暂时还没挖掘到.不过和群里的朋友交流了下,觉得充当下搬运工,小小的翻译下还是挺好的,小弟不才,希望看客大牛们轻拍砖. 什么是AutoMapper? AutoMapper是一个完善的Mapping工具,所谓Mapping即数据对象转换,借用群里朋友的话是多用于领域对象和DTO对象的Mapping或者是SqlDataReader的Mapp

【AutoMapper官方文档】DTO与Domin Model相互转换(上)

前言 Flattening-复杂到简单 Projection-简单到复杂 Configuration Validation-配置验证 Lists and Array-集合和数组 Nested mappings-嵌套映射 后记 上一篇<[道德经]漫谈实体.对象.DTO及AutoMapper的使用 >,因为内容写的有点跑偏,关于AutoMapper的使用最后只是简单写了下,很明显这种简单的使用方式不能满足项目中复杂的需要,网上找了下AutoMapper相关文档,但差不多都是像我一样简单的概述下,看

AutoMapper中的Map和DynamicMap——高手注重细节,思考和总结

近日在做项目的时候,遇到了个怪问题,关于AutoMapper的细节问题,也是不为一般人所关注的. 本人研究AutoMapper也没有多长时间,而且研究的过程中也写了关于AutoMapper的系列基础教程,但是毕竟AutoMapper是个开源项目,并不是一个简单的系列教程就能解释的清楚的,只能解释个大概,项目实战的时候,遇到的细节问题还得自己私下里再次研究.总结. 首先,我要说明的是,这篇博客的写作顺序是按事情发展的顺序来写的,也就是说,在我想写这篇博客时,问题的根本原因还没找到,但是此时,我回过

【AutoMapper官方文档】DTO与Domin Model相互转换(中)

写在前面 AutoMapper目录: [AutoMapper官方文档]DTO与Domin Model相互转换(上) [AutoMapper官方文档]DTO与Domin Model相互转换(中) 持续更新中... 本篇目录: Custom Type Converters-自定义类型转换器 Custom Value Resolvers-自定义值解析器 Null Substitution-空值替换 Containers-IoC容器 后记 随着AutoMapper的学习深入,发现AutoMapper在对

DTO学习系列之AutoMapper(三)

本篇目录: Custom Type Converters-自定义类型转换器 Custom Value Resolvers-自定义值解析器 Null Substitution-空值替换 Containers-IoC容器 后记 随着AutoMapper的学习深入,发现AutoMapper 在对象转换方面(Object-Object Mapping)还蛮强大的,当时使用AutoMapper的场景是DTO与Domin Model相互转换,所以文章的标题就是这个(标题有误),其实AutoMapper不止在

AutoMapper实际项目运用

AutoMapper是对象到对象的映射工具.在完成映射规则之后,AutoMapper可以将源对象转换为目标对象. 配置AutoMapper映射规则 AutoMapper是基于约定的,因此在实用映射之前,我们需要先进行映射规则的配置. public class Source { public int SomeValue { get; set; } public string AnotherValue { get; set; } } public class Destination { public