您的位置:首页 > 移动开发 > Objective-C

贫血模型;DTO:数据传输对象(Data Transfer Object);AutoMapper ;Domain Model(领域模型);DDD(领域驱动设计)

2014-06-25 17:28 781 查看
======================我自己的理解==========================一:DTO我自己的理解,就是比如你有一个类,跟数据库的table表结构一模一样,主键外键什么的都有,但是这个model类,你返回数据到UI层的时候,有些数据是不用的,你就得自己new一个新类出来,新的类从旧的类里面拿值,然后给别人用的就是新的类别,有点类似于我们做接口给android手机用一样的,数据库的类和接口用的类,很相似,但是东西少了的很多,这个新的类(缺胳膊断腿的),只用来传递数据的,就是DTO数据传输对象二:AutoMapper:这个就是一个工具,可以用来帮你把旧的类和新的类,进行一个数据隐射.旧的类别和新的类别,可能是不一样的,例如旧的类别



一本书,有多个作者,每个作者,有自己的名字和地址,如果我想返回给android的接口一个json列表,每行数据就是这本书,以及这本书有哪些作者和作者的地址





那么返回的类可能就是这个类的一个list,这个我们就可以用AutoMapper来帮我们进行关系映射了

三:DomainModel(领域模型):这玩意又是个啥呢?四:DDD又是个啥??=======================推荐答案========================
一些orm框架,在用到Entity的时候有一些开源代码用到了AutoMapper(如:nopcommence),将数据对象转成DTO。比如在ORM中,与数据库交互用的Model模型是具有很多属性变量方法神马的。而当我们与其它系统(或系统中的其它结构)进行数据交互时,出于耦合性考虑或者安全性考虑或者性能考虑(总之就是各种考虑),我们不希望直接将这个Model模型传递给它们,这时我们会创建一个贫血模型来保存数据并传递。神马是贫血模型?贫血模型(DTO,DataTransferObject)就是说只包含属性神马的,只能保存必须的数据,没有有其它任何的多余的方法数据什么的,专门用于数据传递用的类型对象。在这个创建的过程中,如果我们手动来进行,就会看到这样的代码:

Bb=newB();
b.XXX1=a.XXX1;
b.XXX2=a.XXX2;
.........
returnb;


此时,AutoMapper可以发挥的作用就是根据A的模型和B的模型中的定义,自动将A模型映射为一个全新的B模型。基于访问性的控制或从模型本身上考虑。对外开放的原则是,尽量降低系统耦合度,否则内部一旦变更外部所有的接口都要跟随发生变更;另外,系统内部的一些数据或方法并不希望外部能看到或调用。类似的考虑很多,只是举个例子。系统设计的原则是高内聚低耦合,尽量依赖抽象而不依赖于具体。这里感觉automapper就是使数据库实体对一个外部调用实体的转换更简便(不用一个属性一个属性的赋值)。
例如1:数据库里面有用户信息表,供别的系统调用,提供了数据接口。如果直接暴露了数据库层的表结构的话,会对系统本身产生依赖。具体表现在,假定现在因为某种需要,为用户信息增加了十个字段的信息,那么,如果不进行类型映射的话,会导致所有基于此用户数据结构的模块集体挂掉(接口约定变更)。而如果使用了映射的话,我们可以在内部进行转换,保持原有接口不变并提供新的更全面的接口,这是保证系统的可维护性和可迁移性。

例如2:一个Web应用通过前端收集用户的输入成为Dto,然后将Dto转换成领域模型并持久化到数据库中。相反,当用户请求数据时,我们又需要做相反的工作:将从数据库中查询出来的领域模型以相反的方式转换成Dto再呈现给用户。使用AutoMapper(一个强大的Object-ObjectMapping工具),来实现这个转换。
可以参考下http://www.cnblogs.com/jobs2/p/3503990.html

恋爱虽易,相处不易:当EntityFramework爱上AutoMapper

结婚虽易,终老不易:EntityFramework和AutoMapper的婚后生活


AutoMapper参考文档:

【AutoMapper官方文档】DTO与DominModel相互转换(上)
【AutoMapper官方文档】DTO与DominModel相互转换(中)
【AutoMapper官方文档】DTO与DominModel相互转换(下)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: