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

古之立大事者,不惟有超世之才,亦必有坚忍不拔之志。这篇文章主要讲述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 { 10public class HomeController : Controller 11{ 12public ActionResult Index() 13{ 14return View(); 15} 16 17public ActionResult About() 18{ 19ViewBag.Message = "Your application description page."; 20 21return View(); 22} 23 24public ActionResult Contact() 25{ 26ViewBag.Message = "Your contact page."; 27 28return View(); 29} 30 31public JsonResult TestAutoMaper() 32{ 33//Table=> DTO。属性相同自动匹配;且组件支持命名规范的属性名称自动匹配 34Mapper.Initialize(cfg => //https://github.com/AutoMapper/AutoMapper/wiki/Getting-started 35{ 36cfg.CreateMap< TB_MENU, DTO_MENU> (); 37//cfg.CreateMap< DTO_MENU, TB_MENU> (); 38}); 39var tbMenu = new TB_MENU() { MENU_NAME = "权限管理", MENU_LEVEL = "1" }; 40var dto = Mapper.Map< DTO_MENU> (tbMenu); 41return 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 66public class TB_MENU 67{ 68public TB_MENU() 69{ 70} 71 72public string MENU_LEVEL { get; set; } 73public string MENU_NAME { get; set; } 74} 75 76public class DTO_MENU 77{ 78public DTO_MENU() 79{ 80} 81 82public string MENU_LEVEL { get; set; } 83public 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编译失败)
【AutoMapper介绍(未完待续部分没实现)】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
 

    推荐阅读