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

时间:2021-02-22 21:05:52

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