Auto Mapper03
经过上一篇博客的学习,大体了解了Auto Mapper的运行机制和操作流程。我们下来学习下,AutoMapper里面具体的一些东西。
一:规则
当我们使用AutoMapper创建实体和外部Model的映射的时候,AutoMapper的匹配原值有三种方式。
#:名称相同的属性进行映射,不区分大小写。
#:带Get前缀的方法进行映射。<例子(Order和OrderDto):Order中的GetTotal分割成Get和Total,Total会和Dto中的进行匹配。>
#:目标类型属性分割。<CustomerName也是一样,是分割的,Name回合后面的匹配。>
Order类
- /// <summary>
- /// 订单
- /// </summary>
- public class Order
- {
- public Customer Customer { get; set; }
- public decimal GetTotal()
- {
- return 10*10;
- }
- }
- /// <summary>
- /// 顾客
- /// </summary>
- public class Customer
- {
- public string Name { get; set; }
- }
OrderDto类
- /// <summary>
- /// 数据传输对象Dto
- /// </summary>
- public class OrderDto
- {
- public string CustomerName { get; set; }
- public decimal Total { get; set; }
- }
这里我们将Order转换为OrderDto,也就是Order里面的Customer中的Name转换为CustomerName;
- Order dto=new Order()
- {
- Customer = new Customer{Name = "ahui"},
- };
- //配置
- Mapper.CreateMap<Order, OrderDto>();
- //执行
- var order = Mapper.Map<Order,OrderDto>(dto);
- Console.WriteLine(order.CustomerName);
- Console.ReadKey();
二:AutoMapper中利用Condition来进行判断,从而选择是否进行转换。
订单
- /// <summary>
- /// 订单
- /// </summary>
- public class Order
- {
- public Order()
- {
- Number = 100;
- }
- //订单数量
- public int Number { get; set; }
- }
订单DTO
- /// <summary>
- /// 数据传输对象Dto
- /// </summary>
- public class OrderDto
- {
- public OrderDto()
- {
- Num = 90;
- }
- public int Num { get; set; }
- }
Main()方法
- //配置 通过Condition来规定Order中的值是0~12之间。在这个之间就可以进行映射,不是就不映射。输出其默认值10;
- Mapper.CreateMap<Order,OrderDto>().ForMember(x=>x.Num,mo=>mo.Condition(s=>s.Number >0&& s.Number <12)).ForMember(x=>x.Num,mo=>mo.MapFrom(x=>x.Number));
- //执行映射
- var orderDto = Mapper.Map<OrderDto>(new Order(){Number = 10});
- var p1 = Mapper.Map<OrderDto>(new Order(){Number = 20});
- Console.WriteLine(orderDto.Num); //这里输出10
- Console.WriteLine(p1.Num); //这里转换失败,结果为90.
- Console.ReadKey();
通过Condition这个方法我们可以规定如何去转换,指定转换条件。
三:通过Initialize来增加一个配置文件。
这里增加一个配置文件,主要是防止我们以后配置文件多了,我们不必每一次都写,在需要调用配置文件即可。
1:新建一个ProFilesMapper类继承自Profile,并且实现他的方法Configuer(),这个方法就是我们在里面写配置文件的。
- /// <summary>
- /// 配置文件
- /// </summary>
- public class ProFilesMapper:Profile
- {
- protected override void Configure()
- {
- //这里放一些CreateMap(),也就是我们之前的配置映射
- //配置 通过Condition来规定Order中的值是0~12之间。在这个之间就可以进行映射,不是就不映射。输出其默认值10;
- Mapper.CreateMap<Order, OrderDto>().ForMember(x => x.Num, mo => mo.Condition(s => s.Number > 0 && s.Number < 12)).ForMember(x => x.Num, mo => mo.MapFrom(x => x.Number));
- }
- }
2:在main()方法里面可以直接使用加载配置文件就可以实现之前的的配置了。
- //配置
- Mapper.Initialize(x =>x.AddProfile<ProFilesMapper>());
这样就可以实现配置了。
- //配置
- Mapper.Initialize(x =>x.AddProfile<ProFilesMapper>());
- //执行映射
- var orderDto = Mapper.Map<OrderDto>(new Order() { Number = 10 });
- var p1 = Mapper.Map<OrderDto>(new Order() { Number = 20 });
- Console.WriteLine(orderDto.Num); //这里输出10
- Console.WriteLine(p1.Num); //这里转换失败,结果为90.
- Console.ReadKey();
四:实现命名惯例
- 只需要配置中添加下面两句代码
- protected override void Configure()
- {
- //这里放一些CreateMap(),也就是我们之前的配置映射
- //配置 通过Condition来规定Order中的值是0~12之间。在这个之间就可以进行映射,不是就不映射。输出其默认值10;
- Mapper.CreateMap<Order, OrderDto>().ForMember(x => x.Num, mo => mo.Condition(s => s.Number > 0 && s.Number < 12)).ForMember(x => x.Num, mo => mo.MapFrom(x => x.Number));
- //通过下面的两个设置源和目标的命名惯例 而且必须写在CreateMap后面
- SourceMemberNamingConvention=new LowerUnderscoreNamingConvention();
- DestinationMemberNamingConvention=new PascalCaseNamingConvention();
- }
- //配置
- Mapper.Initialize(x=>x.AddProfile<ProFilesMapper>());
- //执行映射
- var d1 = Mapper.Map<OrderDto>(new Order()
- {
- MyName ="ahui"
- });
- Console.WriteLine(d1.my_name);
- Console.ReadKey();
看下我们的两个属性
- public string my_name { get; set; }
- public string MyName { get; set; }
这个我觉得就是像忽略了大小写,直接就可以进行映射。
五:集合之间的映射
这里就是在我们Mapper.Map<>(),执行映射的时候,这里我们看他们需要什么类型的,就传递什么。
配置:
- Mapper.CreateMap<Souce,Destination>();
类代码:
- public class Souce
- {
- public int Value { get; set; }
- }
- public class Destination
- {
- public int Value { get; set; }
- }
main()方法:
- #region 示例08
- //配置
- Mapper.Initialize(x=>x.AddProfile<ProFilesMapper>());
- //初始化,这就是将其初始化为数组
- var sources = new[]
- {
- new Souce(){Value = 1},
- new Souce(){Value = 2},
- new Souce(){Value = 3},
- };
- //执行映射
- IEnumerable<Destination> iEnumerabledDestinations = Mapper.Map<IEnumerable<Destination>>(sources);
- ICollection<Destination> iCollectionDestinations = Mapper.Map<ICollection<Destination>>(sources);
- IList<Destination> iListDest = Mapper.Map<IList<Destination>>(sources);
- List<Destination> listDests =
- Mapper.Map<List<Destination>>(sources);
- Destination[] deatArrey =
- Mapper.Map<Destination[]>(sources);
- Console.WriteLine("******第一个转换*****");
- foreach (var item in iEnumerabledDestinations)
- {
- Console.WriteLine(item.Value + ",,");
- }
- Console.WriteLine("******第二个转换*****");
- foreach (var item in iCollectionDestinations)
- {
- Console.WriteLine(item.Value + ",,");
- }
- Console.WriteLine("******第三个转换*****");
- foreach (var item in iListDest)
- {
- Console.WriteLine(item.Value + ",,");
- }
- Console.WriteLine("******第四个转换*****");
- foreach (var item in deatArrey)
- {
- Console.WriteLine(item.Value + ",,");
- }
- Console.ReadKey();
我们通过这四种类型的执行映射都可以得到我们想要的结果,说明AutoMapper是成功的。
附件:
“tkb至简” http://www.cnblogs.com/farb/p/4932692.html
Auto Mapper03的更多相关文章
- C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)
#include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...
- overflow:hidden与margin:0 auto之间的冲突
相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.
- Android Auto开发之一《开始学习Auto 》
共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...
- width:100%;与width:auto;的区别
<div> <p>1111</p> </div> div{ width:980px; background-color: #ccc; height:30 ...
- SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1)
很多人对Xpath可能比较熟悉,但不知道有没有直接操作过数据库,我们都知道 在Sql2005里公支持的几种查询有Raw,Auto模式,页并没有Path和Elements用法等,如果在2000里使用过 ...
- margin:0 auto;不居中
margin:0 auto:不居中可能有以下两个的原因; 1.没有设置宽度<div style="margin:0 auto;"></div>看看上面的代码 ...
- 初学C++ 之 auto关键字(IDE:VS2013)
/*使用auto关键字,需要先赋初值,auto关键字是会根据初值来判断类型*/ auto i = ; auto j = ; cout << "auto i = 5" & ...
- C++11 - 类型推导auto关键字
在C++11中,auto关键字被作为类型自动类型推导关键字 (1)基本用法 C++98:类型 变量名 = 初值; int i = 10; C++11:auto 变量名 = 初值; auto i ...
- 为什么 "auto a = 1;" 在C语言中可以编译通过?
参照:这里 这让我想起之前看的一部书, int i; 其实是等价与 auto int i; 表示为局部变量 这应该与static是相对的吧?
随机推荐
- 关于实现一个基于文件持久化的EventStore的核心构思
大家知道enode框架的架构是基于ddd+event sourcing的思想.我们持久化的不是聚合根的最新状态,而是聚合根产生的领域事件.最近我在思考如何实现一个基于文件的eventstore.目标有 ...
- MySQL2:四种MySQL存储引擎
前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...
- Java中类继承、接口实现的一些细节(长期更新)
前言 在Java中,子类继承父类,类实现接口是属于常识性的内容了,作为一个Java程序员应该也比较熟悉.不过子类继承父类,类实现接口中还是有一些小细节值得注意一下,本文就从个人工作.学习中入手,总结一 ...
- Boyer-Moore 字符串匹配算法
字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]: 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]: T 和 P 中的元素都属于有限的字 ...
- [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换
[.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...
- knh
市场调研,分析—— 决定是否创业 不要再极度的沉默无言.宅.无存在感,无趣,难熬..
- Post方式的Http流请求调用
HttpRequest公共类: public static class HttpRequestAction { /// <summary> /// 发送http请求并返回响应 /// &l ...
- Java用来进行批量文件重命名,批量提取特定类型文件
原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一 ...
- EF架构~DefaultValue让我的UnitOfWork更可读
回到目录 在编程世界里,使用“否定式”不是一件好事,因为它的可读性并不高,但有时,为了让使用者减少代码量,还是使用了双重否定,直到DefaultValue的出现,它改变了这一切,它可以为你的属性设置你 ...
- Java EE开发平台随手记6——Mybatis扩展4
这篇博客中来说一下对Mybatis动态代理接口方式的扩展,对于Mybatis动态代理接口不熟悉的朋友,可以参考前一篇博客,或者研读Mybatis源码. 扩展11:动态代理接口扩展 我们知道,真正在My ...