AutoMapper是用来解决对象之间映射转换的类库。对于我们开发人员来说,写对象之间互相转换的代码是一件极其浪费生命的事情,AutoMapper能够帮助我们节省不少时间。

一. AutoMapper解决了什么问题?

要问AutoMapper解决了什么问题? 难道不是对象映射转换的问题吗? 
当然是,不过我们可以问深入一些,为什么项目中会出现大量的对象映射转换?(以下对于非MVC项目也适用)

在现代的软件开发中,项目的层级更加的细分,而不同层级之间对于对象的需求是有区别的,这就需要在不同层级间传递数据的时候,必须要转换数据。

举一些实际具体的例子:
在持久层(数据访问层), 我们的User对象,可能是一个包含User表中所有字段的数据的对象,甚至包含了用户的Password信息。而在界面层,我们只是需要显示用户的 name, email,不需要Password这些额外的信息,同时,它还需要用户的考勤信息,而这个信息来自于另外一张表。 
这个例子中,能够发现不同层之间,我们对于数据对象的需求是不同的。 
每个层都做了它们职责范围内的事情: 
持久层关注数据,所以只提供数据对象,它无需知道外层如何使用这些数据对象,也无法知道。 
界面层关注数据的呈现,它只关注它要显示的数据。

那么问题是,谁来弥补它们之间的鸿沟?DTO(Data Transfer Object)——数据传输对象。而AutoMapper就是解决其中涉及到的数据对象转换的工具。

在实际开发中,如果你还可以直接在Business层或者界面层直接使用持久层的对象,因为你认为这个关系不大,整个项目都是你自己控制的,虽然 dirty,但是quick. 作为一个有些洁癖的程序员,我还是建议使用DTO在不同层级之间传递数据。因为当你做更高层级开发的时候,比如开发web service,WCF,Web API这些为系统外部提供接口的开发时候,你就回明白这些好的习惯和思维能够帮助你更加好的设计这些外部接口。

二. AutoMapper如何使用?

先来看一个简单的例子,这个例子是定义Order对象到OrderDto对象之间的映射。(我们把Order称呼为源类,OrderDto称呼为目标类)

Mapper.CreateMap<Order, OrderDto>();//创建映射关系Order –> OrderDto
OrderDto dto = Mapper.Map<OrderDto>(order);//使用Map方法,直接将order对象装换成OrderDto对象

智能匹配

AutoMapper能够自动识别和匹配大部分对象属性:

  • 如果源类和目标类的属性名称相同,直接匹配
  • 目标类型的CustomerName可以匹配源类型的Customer.Name
  • 目标类型的Total可以匹配源类型的GetTotal()方法

自定义匹配规则

AutoMapper还支持自定义匹配规则

Mapper.CreateMap<CalendarEvent, CalendarEventForm>()

                        //属性匹配,匹配源类中WorkEvent.Date到EventDate.ForMember(dest => dest.EventDate, opt => opt.MapFrom(src => src.WorkEvent.Date)).ForMember(dest => dest.SomeValue, opt => opt.Ignore())//忽略目标类中的属性.ForMember(dest => dest.TotalAmount, opt => opt.MapFrom(src => src.TotalAmount ?? 0))//复杂的匹配.ForMember(dest => dest.OrderDate, opt => opt.UserValue<DateTime>(DateTime.Now));固定值匹配

测试
当定义完规则后,可以使用下面的代码来验证配置是否正确。不正确抛出异常AutoMapperConfigurationException.

Mapper.AssertConfigurationIsValid();

三. AutoMapper处理多对一映射

我们开篇提到的问题中,说到界面显示User的name, email, 还有用户的考勤信息,而这些信息来自于2张不同的表。这就涉及到了多对一映射的问题,2个持久层对象需要映射到一个界面显示层的对象。

假设我们的持久层对象是这样的:

public class User

{public int Id { get; set; }public string Name { get; set; }public string Email { get; set; }public string Passworkd { get; set; }public DateTime Birthday { get; set; }
}public class Evaluation
{public int Id { get; set; }public int Score { get; set; }
}

在Asp.net MVC中,我的界面显示层的ViewModel是这样的

public class UserViewModel

{public int Id { get; set; }public string Name { get; set; }public string Email { get; set; }public int Score { get; set; }
}

接下来,为了达到多对一的映射的目的,我们创建这个EntityMapper类

public static class EntityMapper

{public static T Map<T>(params object[] sources) where T : class{if (!sources.Any()){return default(T);}var initialSource = sources[0];var mappingResult = Map<T>(initialSource);// Now map the remaining source objectsif (sources.Count() > 1){Map(mappingResult, sources.Skip(1).ToArray());}return mappingResult;}private static void Map(object destination, params object[] sources){if (!sources.Any()){return;}var destinationType = destination.GetType();foreach (var source in sources){var sourceType = source.GetType();Mapper.Map(source, destination, sourceType, destinationType);}}private static T Map<T>(object source) where T : class{var destinationType = typeof(T);var sourceType = source.GetType();var mappingResult = Mapper.Map(source, sourceType, destinationType);return mappingResult as T;}}

为了实现多个源对象映射一个目标对象,我们使用了AutoMapper的方法,从不同的源对象逐一匹配一个已经存在的目标对象。下面是实际使用在MVC中的代码:

public ActionResult Index()

{var userId = 23,var user = _userRepository.Get(userId);var score = _scoreRepository.GetScore(userId);var userViewModel = EntityMapper.Map<UserViewModel>(user, score);return this.View(userViewModel);
}

四. 使用Profile在Asp.net MVC项目中配置AutoMapper

ProfileAutoMapper中用来分离类型映射定义的,这样可以让我们的定义AutoMapper类型匹配的代码可以更加分散,合理和易于管理。

利用Profile, 我们可以更加优雅的在MVC项目中使用我们的AutoMapper. 下面是具体的方法:

1.  在不同层中定义Profile,只定义本层中的类型映射

继承AutoMapping的Profile类,重写ProfileName属性和Configure()方法。

public class ViewModelMappingProfile: Profile

{public override string ProfileName{get{return GetType().Name;}}protected override void Configure(){Mapper.CreateMap......}
}

2. 创建AutoMapperConfiguration, 提供静态方法Configure,一次加载所有层中Profile定义

public class AutoMapperConfiguration
{public static void Configure(){Mapper.Initialize(x => x.AddProfile<ViewModelMappingProfile>());Mapper.AssertConfigurationIsValid();}
}

3. Global.cs文件中执行

最后,在Global.cs文件中程序启动前,调用该方法

AutoMapperConfiguration.Configuration() 

转载于:https://www.cnblogs.com/hnsongbiao/p/8732627.html

对象映射工具AutoMapper介绍相关推荐

  1. automapper java 有什么_对象映射工具AutoMapper介绍

    AutoMapper是用来解决对象之间映射转换的类库.对于我们开发人员来说,写对象之间互相转换的代码是一件极其浪费生命的事情,AutoMapper能够帮助我们节省不少时间. 一. AutoMapper ...

  2. 基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射

    基于 abp vNext 和 .NET Core 开发博客项目 - 用AutoMapper搞定对象映射 转载于:https://github.com/Meowv/Blog 本篇紧接着来玩一下AutoM ...

  3. .NET平台开源项目速览(14)最快的对象映射组件Tiny Mapper

    好久没有写文章,工作甚忙,但每日还是关注.NET领域的开源项目.五一休息,放松了一下之后,今天就给大家介绍一个轻量级的对象映射工具Tiny Mapper:号称是.NET平台最快的对象映射组件.那就一起 ...

  4. 干掉 BeanUtils!试试这款 Bean 自动映射工具,真心强大!

    平时做项目的时候,经常需要做PO.VO.DTO之间的转换.简单的对象转换,使用BeanUtils基本上是够了,但是复杂的转换,如果使用它的话又得写一堆Getter.Setter方法了.今天给大家推荐一 ...

  5. 【Java生态圈技术总结】之深度剖析MapStruct对象拷贝工具

    目录导航 一.常用的对象拷贝工具基本介绍 1.1 Apache BeanUtils 1.2 Spring BeanUtils 1.3 cglib BeanCopier 1.4 HuTool BeanU ...

  6. 可能是.NET领域性能最好的对象映射框架——Mapster

    我之前文章提到过 MediatR 的作者 Jimmy Bogard,他也是大名鼎鼎的对象映射框架 AutoMapper 的作者.AutoMapper 的功能强大,在 .NET 领域的开发者中有非常高的 ...

  7. vIDC2.0 端口映射工具

    vIDC2.0 端口映射工具 程序介绍: vIDC2.0是一个端口映射工具,主要包含如下功能: 1.代理服务功能,支持http/socks4/socks5代理,支持代理验证,支持udp代理,支持二级代 ...

  8. java orika_常见Bean映射工具分析评测及Orika介绍

    Bean映射工具选择 工作中,我们经常需要将对象转换成不同的形式以适应不同的api,或者在不同业务层中传输对象而不同分层的对象存在不同的格式,因此我们需要编写映射代码将对象中的属性值从一种类型转换成另 ...

  9. AutoMapper多个对象映射到一个Dto对象

    一.定义源映射对象 为了体现AutoMapper映射特性,在SocialAttribute中的Name属性没有定义在People中,People的Ear属性也不存在与SocialAttribute和P ...

最新文章

  1. Android实现一个自己定义相机的界面
  2. C/C++中计算函数运行时间
  3. 极域电子教室软件怎么脱离控制_新疆灵感科技技术汇总~LED控制卡常见软、硬件问题...
  4. csv文件的使用,csv空白行问题
  5. 篮球计分器软件_SPSS 26 综合性数学统计分析工具
  6. (一)数据挖掘概念与技术——韩家炜
  7. GPUImage详细解析- 实时美颜滤镜
  8. matlab 求副瓣电平,一种阵列天线一维方向图的副瓣电平计算方法与流程
  9. kali 暴力破解 WiFi破解+fluxion安装使用(保姆级超详细)
  10. 中文·软件工程类·业务流程图、E-R图和IPO图·实践笔记
  11. 探探提醒对方账号异常_我告诉你探探中对方账号异常怎么回事
  12. 进对的“门”,找对的人 酒店职业发展社交平台门墩儿正式上线
  13. 2014年英语专升本英语阅读「Part II 阅读专区」【文章(图片)、答案、词汇记忆】
  14. 图解Blash数集题解
  15. c语言别踩白块小游戏代码,自学easeljs 根据别踩白块游戏规则自己写的代码
  16. python去除数据集里空格_Python将文本去空格并保存到txt文件中
  17. 命令行 PDF 转换器:::fCoder 2PDF
  18. 2020年12月10日 unravel
  19. django库存管理系统毕业设计(附源码、运行环境)
  20. pythonn说句心里话_说句心里话作文800字

热门文章

  1. 为mysql数据库建立索引
  2. iOS------App之间传递数据的几种方式
  3. 软工_个人博客作业3
  4. 快速排序——算法系列
  5. 学习使用资源文件[2] - Ico
  6. WCF开发入门的六个步骤
  7. js里的数据类型转换
  8. Java之生成Pdf并对Pdf内容操作
  9. WPF效果(GIS三维篇)
  10. Java获取当前日期的前一个月,前一天的时间