无名小卒AutoMapper的大显神威

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

时间: 2024-11-06 14:36:32

无名小卒AutoMapper的大显神威的相关文章

使用AutoMapper实现Dto和Model的自由转换(上)

在实际的软件开发项目中,我们的"业务逻辑"常常需要我们对同样的数据进行各种变换.例如,一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中.另一方面,当用户请求数据时,我们又需要做相反的工作:将从数据库中查询出来的领域模型以相反的方式转换成Dto再呈现给用户.有时候我们还会面临更多的数据使用需求,例如有多个数据使用的客户端,每个客户端都有自己对数据结构的不同需求,而这也需要我们进行更多的数据转换. 频繁的数据转换琐碎而又凌乱,很多时候我们不得不:

使用AutoMapper实现Dto和Model的自由转换(中)

在上一篇文章中我们构造出了完整的应用场景,包括我们的Model.Dto以及它们之间的转换规则.下面就可以卷起袖子,开始我们的AutoMapper之旅了. [二]以Convention方式实现零配置的对象映射 我们的AddressDto和Address结构完全一致,且字段名也完全相同.对于这样的类型转换,AutoMapper为我们提供了Convention,正如它的官网上所说的: 引用 AutoMapper uses a convention-based matching algorithm to

使用AutoMapper实现Dto和Model的自由转换(下)

书接上文.在上一篇文章中我们讨论了使用AutoMapper实现类型间1-1映射的两种方式--Convention和Configuration,知道了如何进行简单的OO Mapping.在这个系列的最后一篇文章我想基于我们的需求讨论一些中级别的话题,包括:如何实现类型体型之间的映射,以及如何为两个类型实现多个映射规则. [四]将一个类型映射为类型体系 先回顾一下我们的Dto和Model.我们有BookDto,我们有Author,每个Author有自己的ContactInfo.现在提一个问题:如何从

对象映射工具AutoMapper介绍

AutoMapper是用来解决对象之间映射转换的类库.对于我们开发人员来说,写对象之间互相转换的代码是一件极其浪费生命的事情,AutoMapper能够帮助我们节省不少时间. 一. AutoMapper解决了什么问题? 要问AutoMapper解决了什么问题? 难道不是对象映射转换的问题吗? 当然是,不过我们可以问深入一些,为什么项目中会出现大量的对象映射转换?(以下对于非MVC项目也适用) 在现代的软件开发中,项目的层级更加的细分,而不同层级之间对于对象的需求是有区别的,这就需要在不同层级间传递

0.AutoMapper

AutoMapper是基于约定的对象 - 对象映射器.AutoMapper使用流畅的配置API来定义对象 - 对象映射策略.AutoMapper使用基于约定的匹配算法来匹配源到目标值.AutoMapper面向模型投影场景,将复杂的对象模型变成DTO和其他简单对象,这些对象的设计更适合于序列化,通信,消息传递或简单的域和应用程序层之间的防腐层. 1.扁平化 2.投影 3.配置验证 4.列表和数组 5.嵌套映射 6.自定义类型转换器 7.自定义值解析器 8.空替换 9.映射操作之前和之后 10.依赖

AutoMapper的介绍与使用(二)

AutoMapper的匹配 1,智能匹配 AutoMapper能够自动识别和匹配大部分对象属性: 如果源类和目标类的属性名称相同,直接匹配,不区分大小写 目标类型的CustomerName可以匹配源类型的Customer.Name 目标类型的Total可以匹配源类型的GetTotal()方法 2,自定义匹配 Mapper.CreateMap<CalendarEvent, CalendarEventForm>()                                          

升级AutoMapper后遇到的“Missing map”与“Missing type map configuration or unsupported mapping”问题

前几天发现 AutoMapper 3.3 的一个性能问题(详见:遭遇AutoMapper性能问题:映射200条数据比100条慢了近千倍),于是将 AutoMapper 升级至最新的 5.1.1 看是否也存在这个性能问题. 升级中想当然地将之前的map配置代码: Mapper.CreateMap<AEntity, ADto>(); Mapper.CreateMap<BEntity, BDto>(); 改为: Mapper.Initialize(cfg => cfg.Create

遭遇AutoMapper性能问题:映射200条数据比100条慢了近千倍

今天遇到了AutoMapper的一个性能问题,使用的是AutoMapper的Project特性,AutoMapper版本是3.3.0,代码如下: return await _repository .GetByStartId(startIngId, itemCount) .Project() .To<TDto>() .ToListAsync(); 当获取包含200条数据的列表时,竟然超过5秒. GetDocs(3000, 200) 6304ms GetDocs(3000, 200) 5822ms

分享一个简单程序(webApi+castle+Automapper+Ef+angular)

前段时间在周末给朋友做了一个小程序,用来记录他们单位的一些调度信息(免费,无版权问题).把代码分享出来.整个程序没有做任何架构.但是麻雀虽小,用到的技术也没少.WebApi+Castle+AutoMapper+Ef+angular,日志记录Log4net.初学者可以学习借鉴,虽然做的比较仓促,但是自我感觉代码写的还是比较规范. git地址:https://git.oschina.net/richieyangs/TaskRecord.git 只需修改web.config中的连接字符串,Ctrl+F