最近在做gxpt(高校平台的项目),前台框架用的是MVC,后台用的是EF+WCF。怎么突然说出来感觉很高大上的样子。呵呵!但是在写代码的时候就发现一个问题。就是在EF中的实体(Model)跟前台需要的实体(DTO数据传输对象)是不一样的,所以就需要转换一下。一开始也没多想,可能是被做项目的热情冲昏了头脑,写多少代码都不觉得类,所以每当需要转换的时候就一个一个的写!给大家看一个例子!
<span style="font-size:18px;">namespace testautomapper { //学生源实体类 public class studentSource { public string name { get; set; } public int age {get;set;} public string sex { get; set; } } }</span>
<span style="font-size:18px;">namespace testautomapper { //学生目标实体类 public class studentPurpost { public string name { get; set; } public string age { get; set; } public string sex { get; set; } } }</span>
<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper { class Program { static void Main(string[] args) { //要被转化的实体 这里模拟的是EF中的实体 studentSource sSource = new studentSource { name = "张宏杰", age = 23, sex = "男" }; //模拟前台要求的实体, 转换后的实体! studentPurpost sPurpost = new studentPurpost(); sPurpost.age = sSource.age.ToString(); ; sPurpost.name = sSource.name; sPurpost.sex = sSource.sex; Console.WriteLine(sPurpost.name + sPurpost.sex + sPurpost.age); } } }</span></span>
可是都是这样一点一点的转换的,如果那个实体有几十个属性的话,哦,my god ;简直不敢想象。如果是集合的话,那莫还要写一个循环。真的好麻烦!
后来写着写着,就感觉烦了,这样子太浪费时间了,就没有什么好的方法吗!答案显然是肯定的,好方法还真的有,答案就是AutoMapper。
什么是AutoMapper呢?
AutoMapper 是什么呢?Object-ObjectMapping工具,一个对象转换为另一个对象的工具!做一个比喻吧,如果在一个程序中,把这个程序中比作一个家庭的话,EF就是爸爸,那么AutoMapper就是妈妈,而DTO就是孩子!妈妈负责协调爸爸和儿子之间的关系。赚钱养家的事情就要交给爸爸去做!
EntityFramework(父亲)、AutoMapper(母亲)和DTO(孩子)你我都知道的官方定义:
- EntityFramework:是微软以 ADO.NET 为基础所发展出来的对象关系对应 (O/R Mapping) 解决方案。
- AutoMapper:Object-Object
Mapping工具。 - DTO:数据传输对象(Data
Transfer Object)。
EntityFramework的定义中有“ORM“关键字,那ORM又是什么?
ORM:对象关系映射(Object/Relation Mapping),是随着面向对象的软件开发方法发展而产生的。面向对象的开发方法是当今企业级应用开发环境中的主流开发方法,关系数据库是企业级应用环境中永久存放数据的主流数据存储系统。对象和关系数据是业务实体的两种表现形式,业务实体在内存中表现为对象,在数据库中表现为关系数据。内存中的对象之间存在关联和继承关系,而在数据库中,关系数据无法直接表达多对多关联和继承关系。
--百度百科
概念清楚了就好办了,我们再来分析下,从上面定义可以看出:AutoMapper是Object-Object映射工具,EntityFramework是一种ORM框架,DTO是数据传输对象(Data
Transfer Object),请注意这三个定义中都包含对象(Object)关键字,毫无疑问,AutoMapper所做的工作就是ORM中的“O”和DTO中的“O”之间的映射转换。
那么我们该如何去应用它呢?
在应用它之前我们先要引用它。点击工具下的库程序包管理器,选择程序包管理控制台!然后输入Install-PackageAutoMapper。 然后在引入AutoMapper;就可以放心的使用来了!
还是上边的那个例子,studentSource实体转换为studentPurpost 实体!
<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper { class Program { static void Main(string[] args) { //创建映射规则 Mapper.CreateMap<studentSource, studentPurpost>(); //创建一个实体 studentSource sSource = new studentSource { name = "张宏杰", age = 23, sex = "男" }; //进行转换 var sPurpost = Mapper.Map<studentPurpost>(sSource); Console.WriteLine(sPurpost.name + sPurpost.sex + sPurpost.age); } } </span>}</span>
这样我们就可以将一个实体转换为另一个实体了!现在的情况是两个实体的子属性字段一样,所以我们就可以转换了!当然这样的简单的实体的集合也是可以进行转换的!
<span style="font-size:18px;"><span style="font-size:18px;">namespace testautomapper { class Program { static void Main(string[] args) { //创建一个转换关系规则 Mapper.CreateMap<studentSource, studentPurpost>(); //创建一个实体集合 List<studentSource> list = new List<studentSource>(); studentSource s = new studentSource { name = "hongjie", age = 13, sex = "nan" }; list.Add(s); //进行转换 List<studentPurpost> sPurpostList = Mapper.Map<List<studentSource>, List<studentPurpost>>(list); Console.WriteLine(sPurpostList[0].age + sPurpostList[0].name + sPurpostList[0].sex); } } }</span></span>
怎么样,感觉是不是很爽。这样做省去了我们的很多麻烦事,让我们可以专心的对待我们的业务逻辑了,在也不用写这种没用的代码浪费生命了!
这就是automapper的简单应用,如果还想继续深入的了解AutoMapper,请继续关注我的博客,本人还会陆续推出其他文章!