AutoMapper介绍(未完待续、部分没实现)

实体间转换工具。其实也可以用Json来实现同名属性、异名属性(用JsonProperty指明)的自动转换

最新版本6.11

需要使用vs2013以上。vs2012下载新版 nuget会遇到问题、只能旧版。

 1 using AutoMapper;
 2 using System;
 3 using System.Collections.Generic;
 4 using System.Linq;
 5 using System.Web;
 6 using System.Web.Mvc;
 7
 8 namespace AutoMapperVs2015.Controllers
 9 {
10     public class HomeController : Controller
11     {
12         public ActionResult Index()
13         {
14             return View();
15         }
16
17         public ActionResult About()
18         {
19             ViewBag.Message = "Your application description page.";
20
21             return View();
22         }
23
24         public ActionResult Contact()
25         {
26             ViewBag.Message = "Your contact page.";
27
28             return View();
29         }
30
31         public JsonResult TestAutoMaper()
32         {
33             //Table=>DTO。属性相同自动匹配;且组件支持命名规范的属性名称自动匹配
34             Mapper.Initialize(cfg =>    //https://github.com/AutoMapper/AutoMapper/wiki/Getting-started
35             {
36                 cfg.CreateMap<TB_MENU, DTO_MENU>();
37                 //cfg.CreateMap<DTO_MENU, TB_MENU>();
38             });
39             var tbMenu = new TB_MENU() { MENU_NAME = "权限管理", MENU_LEVEL = "1" };
40             var dto = Mapper.Map<DTO_MENU>(tbMenu);
41             return Json(dto, JsonRequestBehavior.AllowGet);
42
43             //DTO=>Table。属性相同自动匹配;且组件支持命名规范的属性名称自动匹配
44             //Mapper.Initialize(cfg => {
45             //    //cfg.CreateMap<TB_MENU, DTO_MENU>();
46             //    cfg.CreateMap<DTO_MENU, TB_MENU>();
47             //});
48             //var dtoMenu = new DTO_MENU() { MENU_NAME = "权限管理2", MENU_LEVEL = "2" };
49             //var tbMenu = Mapper.Map<TB_MENU>(dtoMenu);
50             //return Json(tbMenu, JsonRequestBehavior.AllowGet);
51
52
53             //Table=>DTO。属性相同自动匹配;不相同且不符合命名规范的属性,需要人工定义对应匹配关系
54             //TODO:人工定义方法未知、没查到相关文档,旧文档已失效(http://www.cnblogs.com/xishuai/p/3700052.html)。
55             //Mapper.Initialize(cfg =>
56             //{
57             //    cfg.CreateMap<TB_MENU, DTO_MENU>().ForMember(),
58             //});
59             //var dtoMenu = new DTO_MENU() { MENU_NAME = "权限管理2", MENU_LEVEL = "2" };
60             //var tbMenu = Mapper.Map<TB_MENU>(dtoMenu);
61             //return Json(tbMenu, JsonRequestBehavior.AllowGet);
62
63         }
64     }
65
66     public class TB_MENU
67     {
68         public TB_MENU()
69         {
70         }
71
72         public string MENU_LEVEL { get; set; }
73         public string MENU_NAME { get; set; }
74     }
75
76     public class DTO_MENU
77     {
78         public DTO_MENU()
79         {
80         }
81
82         public string MENU_LEVEL { get; set; }
83         public string MENU_NAME { get; set; }
84     }
85 }

未完待续://TODO:人工定义方法未知、没查到相关文档,旧文档已失效(http://www.cnblogs.com/xishuai/p/3700052.html)。

新文档:https://github.com/AutoMapper/AutoMapper/wiki/Getting-started(官网)

旧文档参考(好多方法在新版中已经不正确、弃用、vs编译失败)

http://www.cnblogs.com/xishuai/p/3700052.html

论点:属性相同自动匹配;且组件支持命名规范的属性名称自动匹配。                      这点也可以用json实现,本文开头已提到。

可以看到配置相当的简单,只要设置下Order和OrderDto之间的类型映射就可以了,我们看OrderDto中的CustomerName和Total属性在领域模型Order中并没有与之相对性,没什么可以转换呢,感觉好神奇的样子,其实仔细发现这些属性的命名都有一定的规则,AutoMapper在做解析的时候会按照PascalCase(帕斯卡命名法),就是一种变量命名法,除了PascalCase还有Hungarian(匈牙利命名法)和camelCase(骆驼命名法),PascalCase就是指混合使用大小写字母来构成变量和函数的名字,首字母要大写,camelCase首字母小写,我们C#命名中,一般使用的是camelCase和PascalCase,比较高级的是PascalCase。

  但是为什么AutoMapper会解析Total呢?因为在领域模型Order中有个GetTotal()方法,AutoMapper会解析“Get”之后的单词,所以会与Total相对应,如果你把OrderDto的属性“Total”改为“Totals”,就会发现得到的“Totals”为0。理解了AutoMapper的解析方式,我们就要注意在编写变量、属性或是方法名称的时候一定要规范,这也是一种好的习惯。

http://blog.csdn.net/csethcrm/article/details/52934325

时间: 2024-08-23 00:24:06

AutoMapper介绍(未完待续、部分没实现)的相关文章

[daily][optimize] 去吃面 (python类型转换函数引申的性能优化)(未完待续)

前天,20161012,到望京面试.第四个职位,终于进了二面.好么,结果人力安排完了面试时间竟然没有通知我,也没有收到短信邀请.如果没有短信邀请门口的保安大哥是不让我进去大厦的.然后,我在11号接到了面试官直接打来的电话,问我为啥还没到,我说没人通知我我不知道呀.结果我就直接被他邀请去以访客的身份参加面试了.不知道人力的姑娘是不是认识我,且和我有仇,终于可以报复了... 然后,我终于如约到了,面试官带着我去前台登记.前台的妹子更萌...认为我是面试官,面试官是才是来面试的.我气质真的那么合吗?

NOIP2016 那些我所追求的 [未完待续]

人生第一场正式OI [Day -1] 2016-11-17 期中考试无心插柳柳成荫,考了全市第2班里第1(还不是因为只复习了不到两天考试),马上请了一个周的假准备NOIP(数学生物还是回去上课的) 灰哥跟我一块,tlq考吃了没请假 正好下个周老班出去学习了不害怕 星期4所有人都请假了,漫无目的地复习了一天题,参考题解补了一场模拟赛 晚上灰哥因为住宿直接回家了,还让我给XXX送纸条 SD NOIP的群好多人直播,我们就直播了个国际象棋(竟然有人说八皇后,我只升变了两个兵称为皇后),然而竟然默认开启

听风讲MVC丶 —— 一言不合就撸码 (未完待续&#183;&#183;&#183;&#183;&#183;&#183;)

     希望你看了此小随 可以实现自己的MVC框架     也祝所有的程序员身体健康一切安好                                                                                                                                                ——久伴深海丶默 1.什么是前端控制器(font controller).Java Web中的前端控制器是应用的门面,

一篇文章让Oracle程序猿学会MySql【未完待续】

一篇文章让Oracle DB学会MySql[未完待续] 随笔前言: 本篇文章是针对已经能够熟练使用Oracle数据库的DB所写的快速学会MySql,为什么敢这么说,是因为本人认为Oracle在功能性方面和难度方面都比MySql要高一些,所以精通Oracle的DB在学习MySql的时候,没有必要从头到尾再去搞一遍,只需要掌握两者的用法区别即可.故本篇文章就针对Oracle和MySql的区别来把MySql的知识掌握住,在文章中,实例都是MySql环境下的实例,而Oracle可能知识一句话来概括,所以

我的Java问题集(1)(重点、难点、疑点)未完待续...

学习Java这么久了,总算也了点笔记,一个一个字码的哟! 1.Java中的int等类型变量既然已经有默认值为0,为什么还会出现没有初始化,编译出错呢? 一个变量作为类成员使用的时候,如果没有被初始化,java会为其分配默认值: Boolean false Char '\u0000'(null) byte (byte)0 short (short)0 int 0 long 0L float 0.0f double 0.0d 如果在一个方法中定义一个变量,java不会给其分配默认值,就必须我们来给他

脚本编辑$RANDOM 和 case语句 (笔记) 未完待续

$RANDOM 个人理解是一个用来生成随机数的一个变量 ,由此编写一个脚本 [[email protected] script]# cat random.sh #!/bin/bash # declare -i MAX=0 declare -i MIN=0 for I in `seq 1 10`; do MYRANDOM=$RANDOM [ $I -eq 1 ] && MIN=$RANDOM if [ $I -le 9 ]; then echo -n "$MYRANDOM,&quo

文件查找命令find (笔记)未完待续

之前所学的grep egrep fgrep 都是用来查找文本中的某个字符匹配的 现在来学一下查找文件命令 locate find locate 此命令是非实时查找文件,它是根据全系统文件数据库进行查找的, 仅用模糊匹配,非精确查找 locate filename 即可实现查找其它相关文件 但是注意有时候如果系统是刚安装的有可能还没建立此数据库,使用该命令会提示查找不到数据库 不过不用担心使用updatedb即可自动生成数据库,生成数据库的时候有时候会很慢,这个根据用户的 磁盘上所放的东西多少决定

域名解释(未完待续)

一直没明白什么是一级域名.二级域名.总是搞不懂com.cn.www  之间的关系.别人怎么用,自己就跟着用呗.今天查了点资料,解释一些总是混淆的概念 顶级域名 基本概念:  域名级数是从右至左,按照“.”分开的部分数确定的,有几个部分就是几级. 顶级域名(一级域名)不是品种而是类别. 用户只能申请注册顶级域名(如baidu.com) www. 是网络名 二级域名 顶级域名的下一级,就是我们所说的二级域名.domainpeople.com 域名注册人在以.com结尾的顶级域名中,提供一个二级域名.

Dancing Links 小结 (因为之前丢了一次稿,未完待续)

Dancing Links (DLX)是Knuth为了解决精确覆盖问题而提出的算法,很多搜索问题可以转化位精确覆盖问题从而使用Dancing Links解决(效率会比DFS高很多,因为里面常常蕴涵着意想不到的剪枝) 信息学竞赛中的DLX的问题类似网络流,只需建图+贴版即可 参考文献: 1.DLX的原理:Knuth的论文: 原版:http://arxiv.org/abs/cs/0011047 翻译版:http://wenku.baidu.com/view/d8f13dc45fbfc77da269b