译文链接:https://www.infoworld.com/article/3192900/how-to-work-with-automapper-in-csharp.html

AutoMapper 是一个非常流行的 object-to-object 映射库,它的目的就是帮助你实现不同类型对象之间的映射,举一个例子,在 DDD 开发模式中,你可能需要实现将 DTO object 映射为 Model object,在过去,你需要人肉的将这两个类型下的属性字段进行一一映射,现在 AutoMapper 就可以帮你节省 这种冗余的模板式代码 匹配所耗费的时间。

开始玩 AutoMapper 之前,你需要在 Visual Studio 中创建一个 Project 并且安装 AutoMapper,你可以从 NuGet 上下载,也可以在 NuGet Package Manager Console 控制台输入如下命令:


PM> Install-Package AutoMapper

使用 AutoMapper 创建映射关系

像 AutoMapper 这样的 object-to-object 映射工具,它必须能够做到将一种输入类型转换成另一个输出类型,是不是很拗口,可以先考虑下面的两个类。

public class AuthorModel{public int Id{get; set;}public string FirstName{get;set;}public string LastName{get; set;}public string Address{get; set;}}public class AuthorDTO{public int Id{get; set;}public string FirstName{get; set;}public string LastName{get; set;}public string Address{get; set;}}

接下来,下面的代码段将会告知你如何使用 AutoMapper 在 AuthorModel  和 AuthorDTO 这两个对象之间创建一个 mapping 关系。


var config = new MapperConfiguration(cfg => {cfg.CreateMap<AuthorModel, AuthorDTO>();});

最终的 mapping 转换,你还需要增加几句下面的代码,实现两个类型之间的转换。


IMapper iMapper = config.CreateMapper();
var source = new AuthorModel();
var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);

一个 AutoMapper 的例子

接下来可以上一些数据了,可以参考下面的代码片段,我准备先在 source object 上赋值,然后执行 AutoMapper 中的 Map 方法之后,在 destination object 上原样显示出来。


var config = new MapperConfiguration(cfg => {cfg.CreateMap<AuthorModel, AuthorDTO>();});
IMapper iMapper = config.CreateMapper();
var source = new AuthorModel();
source.Id = 1;
source.FirstName = "Joydip";
source.LastName = "Kanjilal";
source.Address = "India";
var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);
Console.WriteLine("Author Name: "+ destination.FirstName + " " + destination.LastName);

当你执行完这段代码之后,destination  object 上的 Author Name 将会输出到控制台上,目标对象上的 FirstName 和 LastName 和 source object 上的这两个属性值保持一致,说明 automapper 已经帮你成功映射。

值得注意的是,AutoMapper 不仅仅可以 mapping 一个类,还可以 mapping 多个类,默认情况下,AutoMapper会按照默认约定匹配,也就是被mapping的对象之间具有相同的属性名称才能被成功映射,但现实情况下,很多被映射的属性名称是不相同的,这个时候就需要人工介入指定 mapping 关系让 AutoMapper 按照你设定的执行,假定你需要实现 Contact 到 ContactDetails 之间的映射,下面的例子展示了如何去实现这种关系。


var config = new MapperConfiguration(cfg => {cfg.CreateMap<AuthorModel, AuthorDTO>().ForMember(destination => destination.ContactDetails,opts => opts.MapFrom(source => source.Contact));});

下面的语句可以创建最终的  destination object 对象。


var destination = iMapper.Map<AuthorModel, AuthorDTO>(source);

有时候你已经生成了 destination  object,在这基础上你还想二次映射,这时可以使用下面替代语句。


iMapper.Map(sourceObject, destinationObject);

本质上来说,上面的这段代码常用于匹配两个已存在的 object。

使用 AutoMapping 的 projections 功能

AutoMapper 提供了非常好的 projections 功能,projections ????????的地方在于在 mapping 映射时可以无视两者的 object 数据结构是否一致,比如说让 source 的多个属性 映射到 destination 的一个属性上,而上面我们一直讨论的都是一对一的 object mapping。

接下来我们一起学习下 projection,举个例子,考虑如下类。

public class Address{public string City { get; set; }public string State { get; set; }public string Country { get; set; }}

接下来在 AuthorModel 类中新增一个 Address 属性用来存储 Author 的地址信息,修改后的 AuthorModel 类如下:

public class AuthorModel{public int Id{get; set;}public string FirstName{get;set;}public string LastName{get; set;}public Address Address{get; set;}}

然后再更新一下 AuthorDTO  类

public class AuthorDTO{public int Id{get; set;}public string FirstName{get; set;}public string LastName{get; set;}public string City { get; set; }public string State { get; set; }public string Country { get; set; }}

接下来我们需要将 AuthorDTO 映射到 AuthorModel,下面的代码片段展示了如何去实现。


var config = new MapperConfiguration(cfg => {cfg.CreateMap<AuthorDTO, AuthorModel>().ForMember(destination => destination.Address,map => map.MapFrom(source => new Address{City = source .City,State = source .State,Country = source.Country}));

我会在后续的文章中继续讨论 AutoMapper 更多的高级特性,现在,你可以通过这个链接:http://automapper.org/  去学习更多的 AutoMapper 知识。

如何在 C# 中使用 AutoMapper相关推荐

  1. 在 ASP.NET Core 项目中使用 AutoMapper 进行实体映射

    一.前言 在实际项目开发过程中,我们使用到的各种 ORM 组件都可以很便捷的将我们获取到的数据绑定到对应的 List<T> 集合中,因为我们最终想要在页面上展示的数据与数据库实体类之间可能 ...

  2. 如何在SharePoint2010中添加Deep Zoom Image

    如何在SharePoint2010中添加Deep Zoom Image 应用范围 SharePoint 2010 Foundation:SharePoint 2010 Standard:SharePo ...

  3. php如何对数组进行分组,如何在PHP中对数组进行分组排序

    如何在PHP中对数组进行分组排序 发布时间:2021-01-04 16:28:51 来源:亿速云 阅读:98 作者:Leah 这篇文章将为大家详细讲解有关如何在PHP中对数组进行分组排序,文章内容质量 ...

  4. html中section与div,如何在html中的section标签内包含div标签

    我正在制作一个完整版块的页面网站,如this.每个页面都有自己的标签.目前我的网页有4个部分(呈现不同的背景颜色).如何在html中的section标签内包含div标签 我的第一部分有一个容器div, ...

  5. html img调用js,html调用js变量 如何在html中输出js文件中的变量

    html页面代码中怎么调用js变量?html页面代码中怎么调用js变量,例如 在html代码中插入js代码: a=取浏览你把index1.js 中的onReady 去掉,把index1.js改成 fu ...

  6. 如何在OpenCV中为InRange阈值选择颜色的最佳HSV值

    如何在OpenCV中为InRange阈值选择颜色的最佳HSV值 1. 效果图 2. 源码 参考 之前的博客介绍了如何使用Python,OpenCV通过HSV颜色空间转换检测对象,并进行轨迹追踪.怎么选 ...

  7. 管理 zabbix_Zabbix 2019 峰会丨看睿象云如何在 Zabbix 中玩转告警

    2019年11月29日-30日,为期两天的 Zabbix 大会中国站在北京盛大召开,本届 Zabbix 大会以"新视界,新技术,共建未来新监控!"为主题,为与会人员提供前沿的监控技 ...

  8. 如何在JavaScript中实现链接列表

    If you are learning data structures, a linked list is one data structure you should know. If you do ...

  9. csv文件示例_如何在R中使用数据框和CSV文件-带有示例的详细介绍

    csv文件示例 Welcome! If you want to start diving into data science and statistics, then data frames, CSV ...

最新文章

  1. mysql 5.5 5.6 主从_mysql5.6+主从集的版本号(mysql5.5主机和从机载带后,5.5在设置有一定的差距)...
  2. Leetcode-第 283 场周赛
  3. java中spring的级别_java – 在简单的示例项目中更改Spring框架日志级别?
  4. 网络与IO知识扫盲(三):从系统调用的角度,剖析 Socket 的连接过程、BIO 的连接过程
  5. Binding(三):资源和ValueConverter
  6. ASP.NET Core改进了.NET Framework中的字符串处理
  7. 错误:docker-ce-cli conflicts with 2:docker-1.13.1-103.git7f2769b.el7.centos.x86_64 错误:docker-ce confli
  8. 5分钟学会 Vim 分屏操作方方面面
  9. qt制作刻度条(可用作时间及其他刻度)实现缩放,以及平移
  10. 单片机PWM波(AT89C51、ADC0808)
  11. XML编程(CRUD)
  12. 序列标注--词性英文对照表
  13. [sig19]寒霜引擎中strand-based(基于线)的头发渲染
  14. 手机屏幕如何投屏到电脑上(Windows10)
  15. 什么是巴旦木?种植巴旦木树苗产量高吗?
  16. {转发}尚硅谷资料集锦
  17. week2.2数组方法及封装——每天一个JS小总结
  18. 全国计算机noi,中国计算机协会关于设立NOI基地的公告
  19. c语言visit函数作用,[求助]二叉树遍历的程序里面的visit函数如何实现
  20. 软件定制开发与软件外包有什么区别 ?

热门文章

  1. vue.js:利用vue.js做一个抽奖小游戏
  2. tcp/ip ---数据封装过程
  3. 【转】基于 Android NDK 的学习之旅-----数据传输(引用数据类型)
  4. Android笔记:Activity
  5. ASP.NET下MVC设计模式的实现
  6. 用计算机算算术平方根顺序是ON然后是什么,第2课时用计算器求一个正数的算术平方根.ppt...
  7. 在Outlook 2010中使用对话视图
  8. ETL工具kettle的组件--生成记录
  9. js 获取data-属性值
  10. 使用vsftp虚拟用户实现安全访问控制