实体间转换工具。其实也可以用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