码迷,mamicode.com
首页 > 移动开发 > 详细

无名小卒AutoMapper的大显神威

时间:2014-12-20 22:12:14      阅读:295      评论:0      收藏:0      [点我收藏+]

标签:automapper   object to object   ef   dto   

       最近在做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) 解决方案。
  • AutoMapperObject-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,请继续关注我的博客,本人还会陆续推出其他文章!


无名小卒AutoMapper的大显神威

标签:automapper   object to object   ef   dto   

原文地址:http://blog.csdn.net/zhanghongjie0302/article/details/42046135

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!