经过上一篇博客的学习,大体了解了Auto Mapper的运行机制和操作流程。我们下来学习下,AutoMapper里面具体的一些东西。

一:规则

当我们使用AutoMapper创建实体和外部Model的映射的时候,AutoMapper的匹配原值有三种方式。

#:名称相同的属性进行映射,不区分大小写。

#:带Get前缀的方法进行映射。<例子(Order和OrderDto):Order中的GetTotal分割成Get和Total,Total会和Dto中的进行匹配。>

#:目标类型属性分割。<CustomerName也是一样,是分割的,Name回合后面的匹配。>

Order类

  1. /// <summary>
  2. /// 订单
  3. /// </summary>
  4. public class Order
  5. {
  6. public Customer Customer { get; set; }
  7.  
  8. public decimal GetTotal()
  9. {
  10. return 10*10;
  11. }
  12. }
  13. /// <summary>
  14. /// 顾客
  15. /// </summary>
  16. public class Customer
  17. {
  18. public string Name { get; set; }
  19. }

OrderDto类

  1. /// <summary>
  2. /// 数据传输对象Dto
  3. /// </summary>
  4. public class OrderDto
  5. {
  6. public string CustomerName { get; set; }
  7. public decimal Total { get; set; }
  8. }

这里我们将Order转换为OrderDto,也就是Order里面的Customer中的Name转换为CustomerName;

  1. Order dto=new Order()
  2. {
  3. Customer = new Customer{Name = "ahui"},
  4. };
  5. //配置
  6. Mapper.CreateMap<Order, OrderDto>();
  7. //执行
  8. var order = Mapper.Map<Order,OrderDto>(dto);
  9. Console.WriteLine(order.CustomerName);
  10. Console.ReadKey();

二:AutoMapper中利用Condition来进行判断,从而选择是否进行转换。

订单

  1. /// <summary>
  2. /// 订单
  3. /// </summary>
  4. public class Order
  5. {
  6. public Order()
  7. {
  8. Number = 100;
  9. }
  10. //订单数量
  11. public int Number { get; set; }
  12. }

订单DTO

  1. /// <summary>
  2. /// 数据传输对象Dto
  3. /// </summary>
  4. public class OrderDto
  5. {
  6. public OrderDto()
  7. {
  8. Num = 90;
  9. }
  10. public int Num { get; set; }
  11. }

Main()方法

  1. //配置 通过Condition来规定Order中的值是0~12之间。在这个之间就可以进行映射,不是就不映射。输出其默认值10;
  2. 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));
  3. //执行映射
  4. var orderDto = Mapper.Map<OrderDto>(new Order(){Number = 10});
  5. var p1 = Mapper.Map<OrderDto>(new Order(){Number = 20});
  6. Console.WriteLine(orderDto.Num); //这里输出10
  7. Console.WriteLine(p1.Num); //这里转换失败,结果为90.
  8. Console.ReadKey();

通过Condition这个方法我们可以规定如何去转换,指定转换条件。

三:通过Initialize来增加一个配置文件。

这里增加一个配置文件,主要是防止我们以后配置文件多了,我们不必每一次都写,在需要调用配置文件即可。

1:新建一个ProFilesMapper类继承自Profile,并且实现他的方法Configuer(),这个方法就是我们在里面写配置文件的。

  1. /// <summary>
  2. /// 配置文件
  3. /// </summary>
  4. public class ProFilesMapper:Profile
  5. {
  6. protected override void Configure()
  7. {
  8. //这里放一些CreateMap(),也就是我们之前的配置映射
  9. //配置 通过Condition来规定Order中的值是0~12之间。在这个之间就可以进行映射,不是就不映射。输出其默认值10;
  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));
  11. }
  12. }

2:在main()方法里面可以直接使用加载配置文件就可以实现之前的的配置了。

  1. //配置
  2. Mapper.Initialize(x =>x.AddProfile<ProFilesMapper>());

这样就可以实现配置了。

  1. //配置
  2. Mapper.Initialize(x =>x.AddProfile<ProFilesMapper>());
  3. //执行映射
  4. var orderDto = Mapper.Map<OrderDto>(new Order() { Number = 10 });
  5. var p1 = Mapper.Map<OrderDto>(new Order() { Number = 20 });
  6. Console.WriteLine(orderDto.Num); //这里输出10
  7. Console.WriteLine(p1.Num); //这里转换失败,结果为90.
  8. Console.ReadKey();

四:实现命名惯例

  1. 只需要配置中添加下面两句代码
  1. protected override void Configure()
  2. {
  3. //这里放一些CreateMap(),也就是我们之前的配置映射
  4. //配置 通过Condition来规定Order中的值是0~12之间。在这个之间就可以进行映射,不是就不映射。输出其默认值10;
  5. 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));
  6.  
  7. //通过下面的两个设置源和目标的命名惯例 而且必须写在CreateMap后面
  8. SourceMemberNamingConvention=new LowerUnderscoreNamingConvention();
  9. DestinationMemberNamingConvention=new PascalCaseNamingConvention();
  10. }
  1. //配置
  2. Mapper.Initialize(x=>x.AddProfile<ProFilesMapper>());
  3. //执行映射
  4. var d1 = Mapper.Map<OrderDto>(new Order()
  5. {
  6. MyName ="ahui"
  7. });
  8. Console.WriteLine(d1.my_name);
  9. Console.ReadKey();

看下我们的两个属性

  1. public string my_name { get; set; }
  1. public string MyName { get; set; }

这个我觉得就是像忽略了大小写,直接就可以进行映射。

五:集合之间的映射

这里就是在我们Mapper.Map<>(),执行映射的时候,这里我们看他们需要什么类型的,就传递什么。

配置:

  1. Mapper.CreateMap<Souce,Destination>();

类代码:

  1. public class Souce
  2. {
  3. public int Value { get; set; }
  4. }
  5.  
  6. public class Destination
  7. {
  8. public int Value { get; set; }
  9. }

main()方法:

  1. #region 示例08
  2. //配置
  3. Mapper.Initialize(x=>x.AddProfile<ProFilesMapper>());
  4. //初始化,这就是将其初始化为数组
  5. var sources = new[]
  6. {
  7. new Souce(){Value = 1},
  8. new Souce(){Value = 2},
  9. new Souce(){Value = 3},
  10. };
  11. //执行映射
  12. IEnumerable<Destination> iEnumerabledDestinations = Mapper.Map<IEnumerable<Destination>>(sources);
  13.  
  14. ICollection<Destination> iCollectionDestinations = Mapper.Map<ICollection<Destination>>(sources);
  15.  
  16. IList<Destination> iListDest = Mapper.Map<IList<Destination>>(sources);
  17.  
  18. List<Destination> listDests =
  19. Mapper.Map<List<Destination>>(sources);
  20.  
  21. Destination[] deatArrey =
  22. Mapper.Map<Destination[]>(sources);
  23.  
  24. Console.WriteLine("******第一个转换*****");
  25. foreach (var item in iEnumerabledDestinations)
  26. {
  27. Console.WriteLine(item.Value + ",,");
  28. }
  29. Console.WriteLine("******第二个转换*****");
  30. foreach (var item in iCollectionDestinations)
  31. {
  32. Console.WriteLine(item.Value + ",,");
  33. }
  34. Console.WriteLine("******第三个转换*****");
  35. foreach (var item in iListDest)
  36. {
  37. Console.WriteLine(item.Value + ",,");
  38. }
  39. Console.WriteLine("******第四个转换*****");
  40. foreach (var item in deatArrey)
  41. {
  42. Console.WriteLine(item.Value + ",,");
  43. }
  44. Console.ReadKey();

我们通过这四种类型的执行映射都可以得到我们想要的结果,说明AutoMapper是成功的。

附件:

“tkb至简” http://www.cnblogs.com/farb/p/4932692.html

Auto Mapper03的更多相关文章

  1. C++11特性——变量部分(using类型别名、constexpr常量表达式、auto类型推断、nullptr空指针等)

    #include <iostream> using namespace std; int main() { using cullptr = const unsigned long long ...

  2. overflow:hidden与margin:0 auto之间的冲突

    相对于父容器水平居中的代码margin:0 auto与overflow:hidden之间存在冲突.当这两个属性同时应用在一个DIV上时,在chrome浏览器中将无法居中.至于为啥我也不明白.

  3. Android Auto开发之一《开始学习Auto 》

    共同学习,共同进步, 转载请注明出处.欢迎微信交流:sfssqs,申请注明"Android Car"字样 ================= =================== ...

  4. width:100%;与width:auto;的区别

    <div> <p>1111</p> </div> div{ width:980px; background-color: #ccc; height:30 ...

  5. SQl 2005 For XMl 简单查询(Raw,Auto,Path模式)(1)

    很多人对Xpath可能比较熟悉,但不知道有没有直接操作过数据库,我们都知道 在Sql2005里公支持的几种查询有Raw,Auto模式,页并没有Path和Elements用法等,如果在2000里使用过 ...

  6. margin:0 auto;不居中

    margin:0 auto:不居中可能有以下两个的原因; 1.没有设置宽度<div style="margin:0 auto;"></div>看看上面的代码 ...

  7. 初学C++ 之 auto关键字(IDE:VS2013)

    /*使用auto关键字,需要先赋初值,auto关键字是会根据初值来判断类型*/ auto i = ; auto j = ; cout << "auto i = 5" & ...

  8. C++11 - 类型推导auto关键字

    在C++11中,auto关键字被作为类型自动类型推导关键字 (1)基本用法 C++98:类型 变量名 = 初值;   int i = 10; C++11:auto 变量名 = 初值;  auto i ...

  9. 为什么 "auto a = 1;" 在C语言中可以编译通过?

    参照:这里 这让我想起之前看的一部书, int i; 其实是等价与 auto int i; 表示为局部变量 这应该与static是相对的吧?

随机推荐

  1. 关于实现一个基于文件持久化的EventStore的核心构思

    大家知道enode框架的架构是基于ddd+event sourcing的思想.我们持久化的不是聚合根的最新状态,而是聚合根产生的领域事件.最近我在思考如何实现一个基于文件的eventstore.目标有 ...

  2. MySQL2:四种MySQL存储引擎

    前言 数据库存储引擎是数据库底层软件组织,数据库管理系统(DBMS)使用数据引擎进行创建.查询.更新和删除数据.不同的存储引擎提供不同的存储机制.索引技巧.锁定水平等功能,使用不同的存储引擎,还可以 ...

  3. Java中类继承、接口实现的一些细节(长期更新)

    前言 在Java中,子类继承父类,类实现接口是属于常识性的内容了,作为一个Java程序员应该也比较熟悉.不过子类继承父类,类实现接口中还是有一些小细节值得注意一下,本文就从个人工作.学习中入手,总结一 ...

  4. Boyer-Moore 字符串匹配算法

    字符串匹配问题的形式定义: 文本(Text)是一个长度为 n 的数组 T[1..n]: 模式(Pattern)是一个长度为 m 且 m≤n 的数组 P[1..m]: T 和 P 中的元素都属于有限的字 ...

  5. [.net 面向对象编程基础] (4) 基础中的基础——数据类型转换

    [.net面向对象编程基础] (4)基础中的基础——数据类型转换 1.为什么要进行数据转换? 首先,为什么要进行数据转换,拿值类型例子说明一下, 比如:我们要把23角零钱,换成2.30元,就需要把整形 ...

  6. knh

    市场调研,分析—— 决定是否创业 不要再极度的沉默无言.宅.无存在感,无趣,难熬..

  7. Post方式的Http流请求调用

    HttpRequest公共类: public static class HttpRequestAction { /// <summary> /// 发送http请求并返回响应 /// &l ...

  8. Java用来进行批量文件重命名,批量提取特定类型文件

    原因: 因为在网上下载视频教程,有的名字特别长,一般都是机构或者网站的宣传,不方便直接看到视频的简介,所以做了下面的第一个功能. 因为老师发的课件中,文件夹太多,想把docx都放在同一个文件夹下面,一 ...

  9. EF架构~DefaultValue让我的UnitOfWork更可读

    回到目录 在编程世界里,使用“否定式”不是一件好事,因为它的可读性并不高,但有时,为了让使用者减少代码量,还是使用了双重否定,直到DefaultValue的出现,它改变了这一切,它可以为你的属性设置你 ...

  10. Java EE开发平台随手记6——Mybatis扩展4

    这篇博客中来说一下对Mybatis动态代理接口方式的扩展,对于Mybatis动态代理接口不熟悉的朋友,可以参考前一篇博客,或者研读Mybatis源码. 扩展11:动态代理接口扩展 我们知道,真正在My ...