0

0

使用AutoMapper实现Dto和Model的自由转换(中)

巴扎黑

巴扎黑

发布时间:2016-12-20 11:30:28

|

2196人浏览过

|

来源于php中文网

原创

注:本系列文章的代码可以在这里下载。 

在上一篇文章中我们构造出了完整的应用场景,包括我们的model、dto以及它们之间的转换规则。下面就可以卷起袖子,开始我们的automapper之旅了。 
【二】以convention方式实现零配置的对象映射 
我们的addressdto和address结构完全一致,且字段名也完全相同。对于这样的类型转换,automapper为我们提供了convention,正如它的官网上所说的: 

引用

AutoMapper uses a convention-based matching algorithm to match up source to destination values.


我们要做的只是将要映射的两个类型告诉AutoMapper(调用Mapper类的Static方法CreateMap并传入要映射的类型): 

C#代码  

Mapper.CreateMap();  


然后就可以交给AutoMapper帮我们搞定一切了: 

C#代码  

AddressDto dto = new AddressDto  

{  

    Country = "China",  

    City = "Beijing",  

    Street = "Dongzhimen Street",  

    PostCode = "100001"  

};  

Address address = Mapper.Map(Dto);  

address.Country.ShouldEqual("China");  

address.City.ShouldEqual("Beijing");  

address.Street.ShouldEqual("Dongzhimen Street");  

address.PostCode.ShouldEqual("100001");  


如果AddressDto中有值为空的属性,AutoMapper在映射的时候会把Address中的相应属性也置为空: 

C#代码  

Address address = Mapper.Map(new AddressDto  

                                                       {  

                                                           Country = "China"  

                                                       });  

address.City.ShouldBeNull();  

address.Street.ShouldBeNull();  

address.PostCode.ShouldBeNull();  


甚至如果传入一个空的AddressDto,AutoMapper也会帮我们得到一个空的Address对象。 

C#代码  

Address address = Mapper.Map(null);  

address.ShouldBeNull();  


千万不要把这种Convention的映射方式当成“玩具”,它在映射具有相同字段名的复杂类型的时候还是具有相当大的威力的。 
例如,考虑我们的BookStoreDto到BookStore的映射,两者的字段名称完全相同,只是字段的类型不一致。如果我们定义好了BookDto到Book的映射规则,再加上上述Convention方式的AddressDto到Address的映射,就可以用“零配置”实现BookStoreDto到BookStore的映射了: 

C#代码  

IMappingExpression expression = Mapper.CreateMap();  

// Define mapping rules from BookDto to Book here  

Mapper.CreateMap();  

Mapper.CreateMap();  


然后我们就可以直接转换BookStoreDto了: 

C#代码  

BookStoreDto dto = new BookStoreDto  

                       {  

                           Name = "My Store",  

                           Address = new AddressDto  

                                         {  

weenCompany闻名企业网站系统5.3.0 中英文 GB2312
weenCompany闻名企业网站系统5.3.0 中英文 GB2312

weenCompany闻名企业网站系统(免费开源)是一个功能强大, 使用简单的中英文企业智能建站系统, 您只需要一些基本的计算机知识就可以利用此系统完成中小型企业网站的建设; 是低成本企业网站架设方案之首选CMS系统, 也适合建设个人网站。weenCompany闻名企业网站系统功能:1. 程序代码简洁严谨, 整个系统程序仅2M左右大小.2. 中英文双语版共用一套网站程序, 双语页面实现自由切换.3

下载

                                             City = "Beijing"  

                                         },  

                           Books = new List  

                                       {  

                                           new BookDto {Title = "RESTful Web Service"},  

                                           new BookDto {Title = "Ruby for Rails"},  

                                       }  

                       };  

BookStore bookStore = Mapper.Map(dto);  

bookStore.Name.ShouldEqual("My Store");  

bookStore.Address.City.ShouldEqual("Beijing");  

bookStore.Books.Count.ShouldEqual(2);  

bookStore.Books.First().Title.ShouldEqual("RESTful Web Service");  

bookStore.Books.Last().Title.ShouldEqual("Ruby for Rails");  


【三】定义类型间的简单映射规则 
前面我们看了Convention的映射方式,客观的说还是有很多类型间的映射是无法通过简单的Convention方式来做的,这时候就需要我们使用Configuration了。好在我们的Configuration是在代码中以“强类型”的方式来写的,比写繁琐易错的xml方式是要好的多了。 
先来看看BookDto到Publisher的映射。 
回顾一下前文中定义的规则:BookDto.Publisher -> Publisher.Name。 
在AutoMapperzhong,我们可以这样映射: 

C#代码  

var map = Mapper.CreateMap();  

map.ForMember(d => d.Name, opt => opt.MapFrom(s => s.Publisher));  


AutoMapper使用ForMember来指定每一个字段的映射规则: 

引用

The each custom member configuration uses an action delegate to configure each member.


还好有强大的lambda表达式,规则的定义简单明了。 

此外,我们还可以使用ConstructUsing的方式一次直接定义好所有字段的映射规则。例如我们要定义BookDto到第一作者(Author)的ContactInfo的映射,使用ConstructUsing方式,我们可以: 

C#代码  

var map = Mapper.CreateMap();  

map.ConstructUsing(s => new ContactInfo  

                                          {  

                                              Blog = s.FirstAuthorBlog,  

                                              Email = s.FirstAuthorEmail,  

                                              Twitter = s.FirstAuthorTwitter  

                                          });  


然后,就可以按照我们熟悉的方式来使用了: 

C#代码  

BookDto dto = new BookDto  

                        {  

                            FirstAuthorEmail = "matt.rogen@abc.com",  

                            FirstAuthorBlog = "matt.amazon.com",  

                        };  

ContactInfo contactInfo = Mapper.Map(dto);  



如果需要映射的2个类型有部分字段名称相同,又有部分字段名称不同呢?还好AutoMapper给我们提供的Convention或Configuration方式并不是“异或的”,我们可以结合使用两种方式,为名称不同的字段配置映射规则,而对于名称相同的字段则忽略配置。 
例如对于前面提到的AddressDto到Address的映射,假如AddressDto的字段Country不叫Country叫CountryName,那么在写AddressDto到Address的映射规则时,只需要: 

C#代码  

var map = Mapper.CreateMap();  

map.ForMember(d => d.Country, opt => opt.MapFrom(s => s.CountryName));  


对于City、Street和PostCode无需定义任何规则,AutoMapper仍然可以帮我们进行正确的映射。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
clawdbot ai使用教程 保姆级clawdbot部署安装手册
clawdbot ai使用教程 保姆级clawdbot部署安装手册

Clawdbot是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

8

2026.01.29

clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址
clawdbot龙虾机器人官网入口 clawdbot ai官方网站地址

clawdbot龙虾机器人官网入口:https://clawd.bot/,clawdbot ai是一个“有灵魂”的AI助手,可以帮用户清空收件箱、发送电子邮件、管理日历、办理航班值机等等,并且可以接入用户常用的任何聊天APP,所有的操作均可通过WhatsApp、Telegram等平台完成,用户只需通过对话,就能操控设备自动执行各类任务。

1

2026.01.29

Golang 网络安全与加密实战
Golang 网络安全与加密实战

本专题系统讲解 Golang 在网络安全与加密技术中的应用,包括对称加密与非对称加密(AES、RSA)、哈希与数字签名、JWT身份认证、SSL/TLS 安全通信、常见网络攻击防范(如SQL注入、XSS、CSRF)及其防护措施。通过实战案例,帮助学习者掌握 如何使用 Go 语言保障网络通信的安全性,保护用户数据与隐私。

5

2026.01.29

俄罗斯Yandex引擎入口
俄罗斯Yandex引擎入口

2026年俄罗斯Yandex搜索引擎最新入口汇总,涵盖免登录、多语言支持、无广告视频播放及本地化服务等核心功能。阅读专题下面的文章了解更多详细内容。

517

2026.01.28

包子漫画在线官方入口大全
包子漫画在线官方入口大全

本合集汇总了包子漫画2026最新官方在线观看入口,涵盖备用域名、正版无广告链接及多端适配地址,助你畅享12700+高清漫画资源。阅读专题下面的文章了解更多详细内容。

184

2026.01.28

ao3中文版官网地址大全
ao3中文版官网地址大全

AO3最新中文版官网入口合集,汇总2026年主站及国内优化镜像链接,支持简体中文界面、无广告阅读与多设备同步。阅读专题下面的文章了解更多详细内容。

318

2026.01.28

php怎么写接口教程
php怎么写接口教程

本合集涵盖PHP接口开发基础、RESTful API设计、数据交互与安全处理等实用教程,助你快速掌握PHP接口编写技巧。阅读专题下面的文章了解更多详细内容。

10

2026.01.28

php中文乱码如何解决
php中文乱码如何解决

本文整理了php中文乱码如何解决及解决方法,阅读节专题下面的文章了解更多详细内容。

13

2026.01.28

Java 消息队列与异步架构实战
Java 消息队列与异步架构实战

本专题系统讲解 Java 在消息队列与异步系统架构中的核心应用,涵盖消息队列基本原理、Kafka 与 RabbitMQ 的使用场景对比、生产者与消费者模型、消息可靠性与顺序性保障、重复消费与幂等处理,以及在高并发系统中的异步解耦设计。通过实战案例,帮助学习者掌握 使用 Java 构建高吞吐、高可靠异步消息系统的完整思路。

10

2026.01.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7.9万人学习

C 教程
C 教程

共75课时 | 4.3万人学习

C++教程
C++教程

共115课时 | 14.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号