使用AutoMapper实现Dto和Model的自由转换(中)
在上一篇文章中我们构造出了完整的应用场景,包括我们的Model、Dto以及它们之间的转换规则。下面就可以卷起袖子,开始我们的AutoMapper之旅了。
【二】以Convention方式实现零配置的对象映射
我们的AddressDto和Address结构完全一致,且字段名也完全相同。对于这样的类型转换,AutoMapper为我们提供了Convention,正如它的官网上所说的:
我们要做的只是将要映射的两个类型告诉AutoMapper(调用Mapper类的Static方法CreateMap并传入要映射的类型):
- Mapper.CreateMap<AddressDto, Address>();
然后就可以交给AutoMapper帮我们搞定一切了:
- AddressDto dto = new AddressDto
- {
- Country = "China",
- City = "Beijing",
- Street = "Dongzhimen Street",
- PostCode = "100001"
- };
- Address address = Mapper.Map<AddressDto,Address>(Dto);
- address.Country.ShouldEqual("China");
- address.City.ShouldEqual("Beijing");
- address.Street.ShouldEqual("Dongzhimen Street");
- address.PostCode.ShouldEqual("100001");
如果AddressDto中有值为空的属性,AutoMapper在映射的时候会把Address中的相应属性也置为空:
- Address address = Mapper.Map<AddressDto,Address>(new AddressDto
- {
- Country = "China"
- });
- address.City.ShouldBeNull();
- address.Street.ShouldBeNull();
- address.PostCode.ShouldBeNull();
甚至如果传入一个空的AddressDto,AutoMapper也会帮我们得到一个空的Address对象。
- Address address = Mapper.Map<AddressDto,Address>(null);
- address.ShouldBeNull();
千万不要把这种Convention的映射方式当成“玩具”,它在映射具有相同字段名的复杂类型的时候还是具有相当大的威力的。
例如,考虑我们的BookStoreDto到BookStore的映射,两者的字段名称完全相同,只是字段的类型不一致。如果我们定义好了BookDto到Book的映射规则,再加上上述Convention方式的AddressDto到Address的映射,就可以用“零配置”实现BookStoreDto到BookStore的映射了:
- IMappingExpression<BookDto, Book> expression = Mapper.CreateMap<BookDto,Book>();
- // Define mapping rules from BookDto to Book here
- Mapper.CreateMap<AddressDto, Address>();
- Mapper.CreateMap<BookStoreDto, BookStore>();
然后我们就可以直接转换BookStoreDto了:
- BookStoreDto dto = new BookStoreDto
- {
- Name = "My Store",
- Address = new AddressDto
- {
- City = "Beijing"
- },
- Books = new List<BookDto>
- {
- new BookDto {Title = "RESTful Web Service"},
- new BookDto {Title = "Ruby for Rails"},
- }
- };
- BookStore bookStore = Mapper.Map<BookStoreDto,BookStore>(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,我们可以这样映射:
- var map = Mapper.CreateMap<BookDto,Publisher>();
- map.ForMember(d => d.Name, opt => opt.MapFrom(s => s.Publisher));
AutoMapper使用ForMember来指定每一个字段的映射规则:
还好有强大的lambda表达式,规则的定义简单明了。
此外,我们还可以使用ConstructUsing的方式一次直接定义好所有字段的映射规则。例如我们要定义BookDto到第一作者(Author)的ContactInfo的映射,使用ConstructUsing方式,我们可以:
- var map = Mapper.CreateMap<BookDto,ContactInfo>();
- map.ConstructUsing(s => new ContactInfo
- {
- Blog = s.FirstAuthorBlog,
- Email = s.FirstAuthorEmail,
- Twitter = s.FirstAuthorTwitter
- });
然后,就可以按照我们熟悉的方式来使用了:
- BookDto dto = new BookDto
- {
- FirstAuthorEmail = "matt.rogen@abc.com",
- FirstAuthorBlog = "matt.amazon.com",
- };
- ContactInfo contactInfo = Mapper.Map<BookDto, ContactInfo>(dto);
如果需要映射的2个类型有部分字段名称相同,又有部分字段名称不同呢?还好AutoMapper给我们提供的Convention或Configuration方式并不是“异或的”,我们可以结合使用两种方式,为名称不同的字段配置映射规则,而对于名称相同的字段则忽略配置。
例如对于前面提到的AddressDto到Address的映射,假如AddressDto的字段Country不叫Country叫CountryName,那么在写AddressDto到Address的映射规则时,只需要:
- var map = Mapper.CreateMap<AddressDto, Address>();
- map.ForMember(d => d.Country, opt => opt.MapFrom(s => s.CountryName));
对于City、Street和PostCode无需定义任何规则,AutoMapper仍然可以帮我们进行正确的映射。
使用AutoMapper实现Dto和Model的自由转换(中)的更多相关文章
- 使用AutoMapper实现Dto和Model之间自由转换
应用场景:一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.另一方面,当用户请求数据时,我们又需要做相反的工作:将从数据库中查询出来的领域模型以相反的方式转 ...
- 使用AutoMapper实现Dto和Model的自由转换
AutoMapper是一个.NET的对象映射工具. 项目地址:https://github.com/AutoMapper/AutoMapper. 帮助文档:https://github.com/Aut ...
- 使用AutoMapper实现Dto和Model的自由转换(上)
在实际的软件开发项目中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换.例如,一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.另一方面,当用户请求 ...
- 使用AutoMapper实现Dto和Model的自由转换(下)
书接上文.在上一篇文章中我们讨论了使用AutoMapper实现类型间1-1映射的两种方式——Convention和Configuration,知道了如何进行简单的OO Mapping.在这个系列的最后 ...
- AutoMapper完成Dto与Model的转换
在实际的软件开发项目中,我们的“业务逻辑”常常需要我们对同样的数据进行各种变换. 例如,一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.相反,当用户请求数 ...
- 自制AutoMapper实现DTO到持久层Entity的转换
自制AutoMapper实现DTO到持久层Entity的转换 项目中经常涉及到页面DTO更新,保存到数据库的操作,这就必然牵扯到DTO和持久层对象的转换,常见的第三方库有: java:dozer .n ...
- Swift3.0语言教程字符串与URL的数据转换与自由转换
Swift3.0语言教程字符串与URL的数据转换与自由转换 Swift3.0语言教程字符串与URL的数据转换 Swift3.0语言教程字符串与URL的数据转换与自由转换,字符串中的字符永久保存除了可以 ...
- 【转贴】 Flex 预编译处理 与 手机项目、Web项目、Air项目自由转换
原文连接: http://bbs.9ria.com/forum.php?mod=viewthread&tid=263350#lastpost 由于这个论坛不稳定,所以转到这里来,这个帖子蛮有用 ...
- 简单使用AutoMapper实现DTO转换
DTO(Data Transfer Object)数据传输对象,只是传输数据,完成与领域对象之间的转换,并不包含领域业务处理. 当领域模型设计人员只关注核心业务,满足于领域模型的精巧,而不关心具体实现 ...
随机推荐
- Windows上安装并启动visdom
windows上安装visdom$ conda install visdomCollecting package metadata: ...working... doneSolving environ ...
- JavaScript HTML DOM,BOM
DOM DOM 是一个 W3C (万维网联盟) 标准. DOM 定义了用于访问文档的标准: "W3C 文档对象模型 (DOM) 是一个平台和与语言无关的界面, 允许程序和脚本动态访问和更新文 ...
- cloudstack secondary vm starting
等1个小时,差不多可以进入虚拟机,看日志/var/log/cloud.log
- FPGA按一下按键,对应端口输出单个脉冲
对于FPGA的verilog语言,,,规定一个变量不能在多个always中被赋值.但是可以在多个alway块中做判断--结合状态机思想 module state(key,led,clk); input ...
- 搞个组装机:D
时间:2016年7月 主机:就是主机 整机:主机+显示器 推荐:自己组装,淘宝或者京东,或者去淘宝上的宁美国度.攀升兄弟看看. 4000多块配个电脑: 处理器:i5 4590 散片(发热量小) 111 ...
- SVN之 trunk, branches and tags意义
--简单的对照 SVN的工作机制在某种程度上就像一颗正在生长的树: 一颗有树干和很多分支的树 分支从树干生长出来.而且细的分支从相对较粗的树干中长出 一棵树能够仅仅有树干没有分支(可是这样的情况不会持 ...
- 20155323刘威良《网络对抗》Exp7 网络欺诈防范
20155323刘威良<网络对抗>Exp7 网络欺诈防范 实践目标 理解常用网络欺诈背后的原理,以提高防范意识,并提出具体防范方法. 实践内容 (1)简单应用SET工具建立冒名网站 (1分 ...
- 【转】基于Ubuntu Server16.04 安装Odoo11
使用 非 root 用户 进行下面的测试: 本文使用 有sudo 权限的 odoo 用户进行测试()如果是 阿里云,可以先创建 odoo 用户 sudo adduser odoo 2:给root 权限 ...
- Ms.office2010安装教程
下面用到的软件下载地址如下:http://pan.baidu.com/s/1c08cxPI 第一步 1. 将压缩包office2010.rar解压解压后,会出现一个office2010文件夹如图1.1 ...
- docker之搭建私有仓库
一.私有仓库 1.防止网络原因:下载慢,访问不到的情况,需要在内网搭建一个私有仓库. 二.仓库镜像下载 [root@node03 ~]# docker pull registry 三.创建私有仓库容器 ...