Auto Mapper02《demo》
学习这些基本上网上都有一些教程或者别人做的demo,我是按照这个方式去学习的。先做个demo,学会如何去使用它,接着去慢慢的了解它是如何的运行的,理解里面的一些基本的基础知识。我们不可以再像学校里面的那样,先去学习基本的结构,那样我们会很烦脑的,我们应该先学会使用它,接着再去慢慢的了解。
“高内聚低耦合,尽量依赖抽象而不依赖于具体”,这个在面向对象的开发中是很常见的,autoMapper就可以很好的解释这个。automapper具体的功能就是将数据库中的实体表转换为我们页面上使用的model,虽然我们可以直接使用实体的Model,但是我们为了以后着想,界面上使用我们自己定义的Modell,只需要我们利用automapper进行转换就可以了。因为我们的实体Model是最容易发生变化的。

下面是我安装网上的教程做的demo。
书类
//书店
public class BookStore
{
public string Name { get; set; }
public List<Book> Books { get; set; }
public Address Address { get; set; }
}
//书店的地址
public class Address
{
public string Country { get; set; }
public string City { get; set; }
public string Street { get; set; }
public string PostCode { get; set; }
}
// 书类
public class Book
{
public string Title { get; set; }
public string Description { get; set; }
public string Lauguage { get; set; }
public decimal Price { get; set; }
public DateTime? PublishDate { get; set; }
public Publisher Publisher { get; set; }
public int? Paperback { get; set; }
public List<Author> Authors { get;set; }
}
//出版信息
public class Publisher
{
public string Name { get; set; }
}
//每本书都有2个作者
public class Author
{
public string Name { get; set; }
public string Description { get; set; }
public ContactInfo ContactInfo { get; set; }
}
//联系法式
public class ContactInfo
{
public string Email { get; set; }
public string Blog { get; set; }
public string Twitter { get; set; }
}
书Dto
//书店
public class BookStoreDto
{
public string Name { get; set; }
public List<BookDto> Books { get; set; }
public AddressDto Address { get; set; }
}
//书店地址
public class AddressDto
{
public string Country { get; set; }
public string City { get; set; }
public string Street { get; set; }
public string PostCode { get; set; }
}
//这个是对应的Book类
public class BookDto
{
public string Title { get; set; }
public string Description { get; set; }
public string Language { get; set; }
public decimal Price { get; set; }
public DateTime? PublishDate { get; set; }
public string Publisher { get; set; }
public int? Paperback { get; set; }
//01作者信息
public string FirstAuthorName { get; set; }
public string FirstAuthorDescription { get; set; }
public string FirstAuthorEmail { get; set; }
public string FirstAuthorBlog { get; set; }
public string FirstAuthorTwitter { get; set; }
//02作者信息
public string SecondAuthorName { get; set; }
public string SecondAuthorDescription { get; set; }
public string SecondAuthorEmail { get; set; }
public string SecondAuthorBlog { get; set; }
public string SecondAuthorTwitter { get; set; }
}
我们可以发现dto里面将book的整个层级结构 ,全面拉平了,就是说放到了一个类里面,其实我们强大的AutoMapper是可以自动的进行映射的,还有我们的名字不一样的,但是只要是后面的是一样的是可以映射的。
//Mapper.CreateMap<AddressDto, Address>();
AddressDto dto=new AddressDto()
{
Country = "China",
City = "XiAn",
Street = "YUlin",
PostCode = "001"
};
//配置二者的转换
Mapper.CreateMap<AddressDto, Address>();
//这个映射的时候是从左向右的
Address address = Mapper.Map<AddressDto,Address>(dto);
Console.WriteLine(address.Country);
Console.WriteLine(address.PostCode);
Console.ReadKey();
规则:
1:若是一个里面有空属性,那么利用AutoMapper映射过去相应的属性就会为空。
2:可以进行手工的传递。直接就是DTO中的一个属性可以直接映射到Modle中的一个类,但是需要我们自己进行设置。AutoMapper利用ForMember来指定每一个字段的映射规则的。
Mapper.CreateMap<Blog, Model>().ForMember(x => x.BlogCon, mo => mo.MapFrom(x => x.BlogContext));
bookDto的转换
//集合初始化器
BookStoreDto dto=new BookStoreDto()
{
Name = "ahui",
Address = new AddressDto
{
City = "YUlin"
},
Books = new List<BookDto>
{
new BookDto
{
Title = "你好世界"
},
new BookDto
{
Title = "世界你好"
}
}
};
//配置,这里要将转换的内容全部进行配置
Mapper.CreateMap<BookStoreDto, BookStore>();
Mapper.CreateMap<AddressDto, Address>();
Mapper.CreateMap<BookDto, Book>();
//IMappingExpression<BookDto, Book> expression = Mapper.CreateMap<BookDto, Book>();
//转换
BookStore bookStore = Mapper.Map<BookStoreDto,BookStore>(dto);
//利用bookStore输出
Console.WriteLine(bookStore.Address.Country);
Console.WriteLine(bookStore.Name);
foreach (var item in bookStore.Books)
{
Console.WriteLine(item.Title);
}
Console.ReadKey();

这样就成功了。
3:autoMapper中的ConstructUsing。
我们想一次性的定义好所有的字段,我们就可以使用ConstructUsing来操作。
//配置 这里还是说将名称不同的变量之间进行映射。
//定义BookDto到第一作者(Author)的ContactInfo之间的映射。
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 = "1193451014@qq.com",
FirstAuthorBlog="www.cnblogs.com/netxiaohui",
};
ContactInfo contactInfo = Mapper.Map<ContactInfo>(dto);
Console.WriteLine(contactInfo.Blog);
Console.WriteLine(contactInfo.Email);
Console.ReadKey();

4:验证配置是否有效,无效的话会抛出异常的,。
Mapper.AssertConfigurationIsValid();
这里的抛出异常(AutoMapperConfigurationException),我们别小看它,在他执行期间,AutoMapper会检查每个目标类型的属性,一对一的去匹配源中是否存在合适相等的类型。
5:使用忽略选项(Ignore())
情景:目标类型有个成员,不能完成转换,我们不想让其转换,可以这样配置。
//我们不想再转换的时候将Book的Title进行转换,可以将其忽略
Mapper.CreateMap<BookDto, Book>().ForMember(dest=>dest.Title,opt=>opt.Ignore());
错误:出现了和上次一样的错误。
“{"Missing type map configuration or unsupported mapping.\r\n\r\nMapping types:\r\nBookStoreDto -> BookStore\r\nAMapper.Class.BookStoreDto -> AMapper.Class.BookStore\r\n\r\nDestination path:\r\nBookStore\r\n\r\nSource value:\r\nAMapper.Class.BookStoreDto"}”
这个就是没有进行配置,就是说AutoMapper不知道你要如何去转换,后来才发现我写反了,应该先进行配置在转换。

就是错在了这里。
附件:
“呆河马” http://www.cnblogs.com/jobs2/p/3503990.html
“魔古先生” http://www.cnblogs.com/mushroom/p/4291975.html
Auto Mapper02《demo》的更多相关文章
- 《zw版·Halcon入门教程与内置demo》
<zw版·Halcon入门教程与内置demo> halcon系统的中文教程很不好找,而且大部分是v10以前的版本. 例如,QQ群: 247994767(Delphi与halcon), 共享 ...
- GZFramwork数据库层《前言》Demo简介
本系列旨在熟悉GZFramwork数据库层操作,对数据库表进行增删改查,单据编号生成等: 详细见图: 普通单表操作: 数据库建模: 创建表脚本: from sys.sysreferences r jo ...
- 微信公众号开发《三》微信JS-SDK之地理位置的获取,集成百度地图实现在线地图搜索
本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...
- 微信公众号开发《三》微信JS-SDK之地理位置的获取与在线导航,集成百度地图实现在线地图搜索
本次讲解微信开发第三篇:获取用户地址位置信息,是非常常用的功能,特别是服务行业公众号,尤为需要该功能,本次讲解的就是如何调用微信JS-SDK接口,获取用户位置信息,并结合百度地铁,实现在线地图搜索,与 ...
- 《HelloGitHub》第 57 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- 天河微信小程序入门《四》:融会贯通,form表单提交数据库
天河在阔别了十几天之后终于又回来了.其实这篇文章里的demo是接着(天河微信小程序入门<三>)后面就做了的,但是因为最近在做别的项目,所以就偷懒没有发出来.放到今天来看,从前台提交数据到数 ...
- 天河微信小程序入门《三》:打通任督二脉,前后台互通
原文链接:http://www.wxapp-union.com/forum.php?mod=viewthread&tid=505&extra=page%3D1 天河君在申请到https ...
- 原创:从零开始,微信小程序新手入门宝典《一》
为了方便大家了解并入门微信小程序,我将一些可能会需要的知识,列在这里,让大家方便的从零开始学习:一:微信小程序的特点张小龙:张小龙全面阐述小程序,推荐通读此文: 小程序是一种不需要下载.安装即可使用的 ...
- 《InsideUE4》-6-GamePlay架构(五)Controller
<InsideUE4>-6-GamePlay架构(五)Controller Tags: InsideUE4 GamePlay 那一天 Pawn又回想起了 被Controller所支配的恐惧 ...
随机推荐
- 可在广域网部署运行的QQ高仿版 -- GG叽叽V1.8(源码)
距离的GG 1.0发布已经三周了,这三周内,我利用业余时间为GG增加了视频聊天的功能.个人觉得进展有些缓慢,主要是因为大多数时间都花在了UI上.由于本人不会PS,所以图片素材都是从网上一个一个搜下来的 ...
- 如何让Hadoop读取以gz结尾的文本格式的文件
背景: 搜索引擎在build全量时,会产生数G的xml的中间文件,我需要去查询这些中间文件中,是否有某个特殊的字符.xml文件有很多,每个都有几百M,存储在hdfs上,而且是以gz结尾的文本格式的文件 ...
- [ZigBee] 11、ZigBee之睡眠定时器二
1.前言 上一节讲了Zigbee的睡眠定时器利用外部按键使系统从休眠态唤醒到工作态,其核心在于: 61 void SysPowerMode(uchar mode) 62 { 63 if(mode &g ...
- [stm32] SIM808模块之发短信\GPS\TCP\HTTP研究
SIM8008是四频模块,全球可用.含有TTL电平接口等接口,能够实现发短信.打电话.GPRS传输数据.GPS等功能.[正版资料请找beautifulzzzz·博客园] 一些细节: >> ...
- Android中viewPager的一两点使用
Android中viewPager的一两点使用 viewPager是谷歌官方提供的一种方便实现页面滑动效果的控件,可以直接使用也可以和fragment联合使用.这里只简单说下直接使用. 使用viewP ...
- 知方可补不足~SqlServer自动备份数据库及清理备份文件
回到目录 对于SQLSERVER这个关系型数据库来说,为了保持数据的安全,备份是必须的,当你的一个误操作导致数据丢失,这可能是灾难性的,是不被允许发生的,这时,我们必须要做好定期的备份工作,如我们可以 ...
- Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换
Atitit 跨平台异常处理(2)--------异常转换 -----java c# js异常对象结构比较and转换 { "@type":"java.lang.Runti ...
- salesforce 零基础学习(二十二)Test简单使用
本篇内容只是本人简单的mark开发中常出现的一些疑问,方便后期项目使用时奠定基础,如果对Test零基础童鞋,欢迎查看Test官方的使用介绍: https://help.salesforce.com/a ...
- Maven Myeclipse 搭建项目
一.maven概述 Maven是基于项目对象模型(POM),可以通过一小段描述信息来管理项目的构建,报告和文档的软件项目管理工具! 简单说Maven 是一个项目管理和构建自动化工具 二.环境搭建 1. ...
- vuejs件同一个挂载点上切换组
vuejs件同一个挂载点上切换组 动态组件 http://cn.vuejs.org/guide/components.html#动态组件 多个组件可以使用同一个挂载点,然后动态地在它们之间切换.使用保 ...