AutoMapper知多少?

 1.      事件的背景

  初始AutoMapper是在做成绩管理系统1.0的时候,那个时候因为系统采用了WCF+MVC+easyUI+EF的框架,那么我们在实现B层与WCF层之间的实体转换的时候就需要借助于某种方法(用纯代码实现)或者某种工具实现,我采取的是后者,因为每当遇到一个问题的时候,我总是觉得有比写纯代码更加简洁的方法。

  那个时候只是上网查个例子就用,别的也没有想那么多。直到今天我的一个组内的伙伴让我调试的一个错误,我才真正意识到自己的是需要深入研究的。

  初接手一个项目的时候,对于框架的以及业务的分析不是那么的清晰的条件下,大多数的人采用的是按实体划分而不是业务划分,估计就有人想省事,那就是采用把Model层的各个实体直接定义到数据契约或者我们说的提供给ui供显示的使用的viewModel,但是这样的结果出现偶然性,如果没有主外键的关系或者其它的关系复杂的方法,那么直接引入Automapper什么时候估计也不会报错,但是如果你的有复杂的主外键关系或者其它的一些复杂的方法,那么直接引入而不加配置的话,可能会出现很多的错误,比如出现“miss
type map configuration or unsurported”等等。

  此时经过查找将供UI显示的实体中的显示下面的存在复杂的主外键关系,注释掉后发现了,困扰的问题得以解决了。下面我们来认识一下Automapper吧。

 2.      Automapper知多少?

  ?  什么是Automapper

  在学习EF的时候我们知道了ORM(Object Relational Mapping)映射,是一种对象关系的映射,对象-关系映射(ORM)系统一般以中间件的形式存在,主要实现程序对象到关系数据库数据的映射。

  而Automapper是一种实体转换关系的模型,AutoMapper是一个.NET的对象映射工具。主要作用是进行领域对象与贫血模型(DTO)之间的转换、数据库查询结果映射至实体对象。

  ?  什么是DTO?

  概念

  数据传输对象(DTO)(DataTransfer Object),是一种设计模式之间传输数据的软件应用系统。数据传输目标往往是数据访问对象从而从数据库中检索数据。数据传输对象与数据交互对象或数据访问对象之间的差异是一个以不具有任何行为除了存储和检索的数据(访问和存取器)。

  为什么用?

  引用别人的话说“表现层与应用层之间是通过数据传输对象(DTO)进行交互的,数据传输对象是没有行为的POCO(Plain Old CLR Object)对象,它的目的只是为了对领域对象进行数据封装,实现层与层之间的数据传递。为何不能直接将领域对象用于数据传递?因为领域对象更注重领域,而DTO更注重数据。不仅如此,由于“富领域模型”的特点,这样做会直接将领域对象的行为暴露给表现层。

  需要了解的是,数据传输对象DTO本身并不是业务对象。数据传输对象是根据UI的需求进行设计的,而不是根据领域对象进行设计的。比如,Customer领域对象可能会包含一些诸如FirstName,
LastName, Email, Address等信息。但如果UI上不打算显示Address的信息,那么CustomerDTO中也无需包含这个 Address的数据”。

  ?  什么是领域对象?

  概念

  领域模型是对领域内的概念类或现实世界中对象的可视化表示。又称概念模型、领域对象模型、分析对象模型。它专注于分析问题领域本身,发掘重要的业务领域概念,并建立业务领域概念之间的关系。

  领域模型就是面向对象的,面向对象的一个很重要的点就是:“把事情交给最适合的类去做”,即:“你得在一个个领域类之间跳转,才能找出他们如何交互”。在我们的系统中Model(EF中的实体)就是领域模型对象。领域对象主要是面对业务的,我们是通过业务来定义Model的。

  ?  怎么用?

  这个网上的资料很丰富,大家可以上网查找,对于一件事情,别人告诉你有这个事情,剩下的事情就是自己去学,给大家推荐一个博客

http://www.cnblogs.com/smileberry/p/3838143.html

 3.      小结

  我们定义的领域模型对象例如Model面向业务,而DTO(在我们的系统中是数据契约或者说是viewModel是供ui使用的)是面向界面UI,所以我们应该根据UI的需求来定义。利用DTO可以使表现层与Model解耦解除,表现层(也就是显示的界面)不需要引用Model,这样的好处是即使我们的模型或者model发生改变,而界面无需改变的情况下,我们可以直接修改model而无需更改界面的显示,这样是实现了解耦合。

时间: 2024-11-06 17:11:50

AutoMapper知多少?的相关文章

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

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

AutoMapper中的Map和DynamicMap——高手注重细节,思考和总结

近日在做项目的时候,遇到了个怪问题,关于AutoMapper的细节问题,也是不为一般人所关注的. 本人研究AutoMapper也没有多长时间,而且研究的过程中也写了关于AutoMapper的系列基础教程,但是毕竟AutoMapper是个开源项目,并不是一个简单的系列教程就能解释的清楚的,只能解释个大概,项目实战的时候,遇到的细节问题还得自己私下里再次研究.总结. 首先,我要说明的是,这篇博客的写作顺序是按事情发展的顺序来写的,也就是说,在我想写这篇博客时,问题的根本原因还没找到,但是此时,我回过

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

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

知乎上线“明日头条”,亮剑直指今日头条?

4月1日凌晨,知乎悄然上线了"资讯类内容",并对外宣称发布了"明日头条",意图向移动资讯开始发起进攻.来自知乎内部员工发布的<知乎重磅发布[明日头条],直接促使领结婚证免费>愚人文章中煞有介事地称:"知乎现在正式重磅发布新功能--明日头条,这个划时代新功能将颠覆性地为知乎用户带来全新的内容体验,通过高质量内容的聚合,知乎希望,给世界增加一点颜值." 知乎在这个时候突然推出的"明日头条",着实让人有些惊讶,难道知乎真

腾讯优图及知脸(ZKface)人脸比对接口测试(python)

一.腾讯优图 1.开发者地址:http://open.youtu.qq.com/welcome/developer 2.接入流程:按照开发者页面的接入流程接入之后,创建应用即可获得所需的AppID.SecretID和SecretKey这是进行接口调用必须的凭证 3.测试流程: 3.1.测试可以直接调用网络接口,或者下载相应语言的sdk(http://open.youtu.qq.com/welcome/developer#/tool-sdk),我采用的是下载python版本的sdk(该sdk对应的

肯.威尔伯论觉知

https://tieba.baidu.com/p/4584305679?red_tag=3109625582 1.纯粹的觉知是持续不断的平等的威尔伯重拾消失长达五年之久的写作灵感,他过着离群索居的生活,除了购买日用品之外,几乎完全与世隔绝,三年中只见了四个人,他形容那种情况很像传统的禁语闭关.当时他正埋首于<性.生态学.灵性>这本巨著的撰写工作,他形容其过程就像是一场永无止境的噩梦,为了涵盖四大象限各个领域的知识系统,他需要搜集的资料可想而知有多么博杂了.闭关到第七个月,他患了自称的“渴肤症

仿知乎程序 fragment的切换以及toolbar在不同页面下显示的menu不同

       我们在看知乎的时候,你会发现,首页,发现,关注,收藏,草稿这五项,你在点击之后进入到相应页面之后,侧滑菜单还在,你左侧滑一下,这个侧滑菜单还在,而提问,左滑屏幕,这个页面就没有,有点像返回上一页的感觉. 从操作来看,五页面应该是fragment之间的切换,而提问是单独的activity.     我们先从几个fragment入手,这里我们建立五fragment页,选择继承自android.support.v4.app.Fragment,因为这五个页面基本上都一样,就是简单的一个布局

知问前端——创建header区

创建界面 我们首先要设计一个header,这个区域将要设计成永远置顶.也就是,往下拉出滚动条也永远在页面最上层可视区内.在header区,目前先设计LOGO.搜索框.按钮.注册和登录即可. 项目的大致骨架如下: index.html: <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>知问前端</title> <script type=&q

为知发表博客

标题1 标题2 这是在为知笔记中进行的引用 //这是语句块 //hello Word测试程序 void main { printf("hello World"); } 无序列表 列表内容2 添加截图内容名 ? 符号原来是这样插入的啊 来自为知笔记(Wiz)