天地模型(DomainModel)与视图模型(ViewModel)领域模型(DomainModel)与视图模型(ViewModel)

   
Model-View-Controller(模型-视图-控制器,MVC)模式将您的软件组织并说明成三独了不同的角色:

   
Model-View-Controller(模型-视图-控制器,MVC)模式将您的软件组织并说变成三单意不同之角色:

  • Model
    封作了而的运用数据、应用流程和事务逻辑。
  • View
    从 Model 获取数据并格式化数据因开展亮。
  • Controller
    控制程序流程,接收输入,并将其传递给 Model 和 View。
  • Model
    封作了您的应用数据、应用流程及事情逻辑。
  • View
    从 Model 获取数据并格式化数据以拓展亮。
  • Controller
    控制次流程,接收输入,并拿它传递给 Model 和 View。

   
与其他设计模式不同,MVC
模式并没有直接体现一个君能编写或配备的切近组织。相反,MVC
更像一个概念上的指原则要范型。概念上的 MVC 模式于叙为老三个目标 ——
Model、View 和 Controller —— 之间的关联。由于 View 和 Controller
都足以从 Model 请求数据,所以 Controller 和 View 都依靠
Model。任何输入还经过 Controller 进入你的体系,然后 Controller 选择一个
View 来出结果。

   
与其余设计模式不同,MVC
模式并从未直接体现一个若可知编写或部署的类组织。相反,MVC
更像一个定义上的点拨规范要范型。概念上的 MVC 模式让描述为老三独对象 ——
Model、View 和 Controller —— 之间的涉及。由于 View 和 Controller
都得以从 Model 请求数据,所以 Controller 和 View 都靠
Model。任何输入还由此 Controller 进入你的系,然后 Controller 选择一个
View 来起结果。

    Model
包含了若的应用逻辑和数据,在公的应用程序中,它很可能是主要的值驱动器。Model
没有其余和见层相关的特征,而且为和 HTTP
请求处理职责中全无关。

    Model
包含了若的应用逻辑和数目,在公的应用程序中,它挺可能是着重的值驱动器。Model
没有其它和表现层相关的表征,而且为和 HTTP
请求处理职责中全然无关。

    Domain
Model
是一个靶层,是本着现实世界逻辑、数据及汝应用程序所处理的问题之空洞。

    Domain
Model
是一个目标层,是指向现实世界逻辑、数据及而应用程序所处理的问题的空洞。

    Domain
Model 可分为两生类:Simple Domain Model 和 Rich Domain Model。

    Domain
Model 可分为两雅接近:Simple Domain Model 和 Rich Domain Model。

  • Simple Domain Model
    往往是工作对象以及数据库表之间一对一底通信。你都显现了之几种模式 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,所有这些和数据库相关的设计模式 ——
    可以协助您将与数据库相关的逻辑组织成为一个 Domain
    Model。
  • Rich Domain
    Model 包含复杂的,使用持续机制紧密联系在一道的对象网络,在本书和 GoF
    一挥毫中牵线的洋洋模式从在杠杆作用。Rich Domain Models
    往往是柔性的,精心测试了之,不断重构的,而且和她所表达的小圈子所急需的工作逻辑严密耦合。
  • Simple Domain Model
    往往是业务对象与数码库表之间一对一的通信。你已经显现了之几栽模式 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,所有这些跟数据库相关的设计模式 ——
    可以助而将和数据库相关的逻辑组织成一个 Domain
    Model。
  • Rich Domain
    Model 包含复杂的,使用持续机制紧密联系在共同的目标网络,在本书和 GoF
    一挥毫中牵线的很多模式从在杠杆作用。Rich Domain Models
    往往是柔性的,精心测试了的,不断重构的,而且和它们所表达的圈子所用的工作逻辑严密耦合。

   
采用哪种 Domain
Model 类型取决于你的应用环境。如果您正建之凡一个非常简单的表单处理
web 应用,没必要建立 Rich Domain
Model。然而,如果您正编纂一个价值数百万之柜内联网架构的为主库,那么拼命付出一个
Rich Domain Model
就是值得的,它可呢而提供一个纯粹表达业务过程的阳台,并可于您速传输数据。

   
采用哪种 Domain
Model 类型取决于你的应用环境。如果你正在建立之是一个非常简单的表单处理
web 应用,没必要建立 Rich Domain
Model。然而,如果你正在编辑一个值数百万底柜外联网架构的中心库,那么拼命开发一个
Rich Domain Model
就是值得的,它可以吗卿提供一个标准表达业务经过的阳台,并可以为您速传输数据。

    Martin
Fowler 在 PoEAA 中并且省略介绍了片栽 Domain Model。而 Eric Evans 的
Domain Driven Design 一写,则完全专注于 Rich Domain Model
的实践使和出进程。

    Martin
Fowler 在 PoEAA 中还要省略介绍了少种 Domain Model。而 Eric Evans 的
Domain Driven Design 一书,则净专注于 Rich Domain Model
的施行以和出进程。

    View
用于拍卖所有表现层方面的问题。View 从 Model
获取数据,并得以管其格式化成用于 web 页的 HTML,用于 web 服务的
XML,或用于 email 的文书。

    View
用于拍卖所有表现层方面的问题。View 从 Model
获取数据,并可以管其格式化成用于 web 页的 HTML,用于 web 服务的
XML,或用来 email 的文书。

   
许多的MVC模式的兑现呢都应用一个View Model或Application
Model的定义,Controller是关系的介绍人,架从世界模型与用户界面里的桥,属于表现层。为View的简单性,Controller负责处理或以世界模型转换成为一个View
Model,这便号称数据传对象(DTO)

   
许多底MVC模式之落实为还施用一个View Model或Application
Model的概念,Controller是关系的媒婆,架于世界模型与用户界面里的大桥,属于表现层。为了View的简单性,Controller负责处理或者以世界模型转换成一个View
Model,这便称为数据传对象(DTO)

    DomainModel != ViewModel

    DomainModel != ViewModel

   
DomainModel代表着相应的域,但ViewModel却是啊View的消而创办。这两者之间或许(一般景象下都)是不同的,此外DomainModel是数增长行为的组合体,是出于复杂的变量类型组成的还要有着层次。而ViewModel只是出于片String等简单变量类型组成。如果想移除冗余并且爱造成差的ORM代码,可以下AutoMapper.如果想使询问又多。

   
DomainModel代表正在相应的域,但ViewModel却是啊View的待而创立。这两者之间或许(一般情形下还)是不同的,此外DomainModel是数额增长行为的组合体,是出于复杂的变量类型组成的还要有层次。而ViewModel只是出于片String等简便变量类型组成。如果想移除冗余并且爱招差的ORM代码,可以动用AutoMapper.如果想使打听又多。

   
这就是说领域模型(Domain Model
)和视图模型(View Model)有什么两样呢?

   
那么领域模型(Domain Model
)和视图模型(View Model)有什么两样也?

   
在ASP.NET MVC的应用程序中经常可以可以看出View
Model,经常我们都当世界模型与视图模型是跟一个事物。这特别是将世界模型包含在数码传对象DTO里的时节,例如使用Entity
Framework之类的ORM工具转的实业。在这种状况下,领域模型与视图模型包含的实体非常相似,都是片简的CRUD操作。

   
在ASP.NET MVC的应用程序中时得得见到View
Model,经常我们且觉着世界模型和视图模型是与一个物。这特别是把世界模型包含在数额传对象DTO里的时候,例如利用Entity
Framework之类的ORM工具转的实体。在这种场面下,领域模型和视图模型包含的实业非常相像,都是部分简便的CRUD操作。

   
这些实体有诸多特性,有同等或者看似之号,你可非常容易地映射领域实体对应视图模型中的一个特性。不过,这些相似之性能为或略有不同,例如类型或者格式。例如,用户填写的用户界面的一个特性,他在视图模型里或者是一个“Nullable”的。

   
这些实体有成百上千性能,有一致或接近之名,你得生易地映射领域实体对应视图模型中的一个性能。不过,这些相似的特性为可能略有不同,例如类型或者格式。例如,用户填写的用户界面的一个性能,他在视图模型里或者是一个“Nullable”的。

   
另一方面,领域实体可能得一个经过认证的法定的价值,所以用一个以用户界面的小圈子模型中的转移。另一个事例是,用户界面可能会见来得一个滑块,用于用户选择多少天之后提交他的订单。在这种情形下,视图模型或以一个平头属性来代表,领域模型通常是一个日期值。

   
另一方面,领域实体可能用一个由此证实的官方的价,所以需要一个当用户界面的领域模型中的易。另一个例证是,用户界面可能会见显得一个滑块,用于用户挑选多少天之后提交他的订单。在这种情景下,视图模型或使一个整数特性来表示,领域模型通常是一个日期值。

   
视图模型通常仅含有领域模型的一个子集,而且只有含界面及所急需之性质。此外,视图模型或是一个天地模型树的扁平版,例如,一个Customer实体有一个Address,而就又是一个整体,它涵盖街道地址,邮政编码,国家等。一个Customer
视图模型用于展示数据,将地方数据拉平填充到视图模型类里。

   
视图模型通常只含有领域模型的一个子集,而且就含界面及所急需之性质。此外,视图模型或是一个天地模型树的扁平版,例如,一个Customer实体有一个Address,而就又是一个完好无损,它涵盖街道地址,邮政编码,国家等。一个Customer
视图模型用于展示数据,将地方数据拉平填充到视图模型类里。

   
此外如果一个View需要而处理几乎单领域模型,View
Model就是立即几独Domain
Model的总额。领域模型与视图模型中发生很多貌似之地方,我们常常干脆就是管Domain
Model当作View Model来采取了。
   
上面讨论了世界模型和视图模型的相似性,我们来探视都发几种植办法把世界模型转换为视图模型,通常有3种植方法:

   
此外要一个View需要而处理几乎单世界模型,View
Model就是马上几乎独Domain
Model的总额。领域模型与视图模型中有多一般之地方,我们常常干脆就是管Domain
Model当作View Model来运了。
   
上面讨论了世界模型与视图模型的相似性,我们来探都发出几栽办法把世界模型转换为视图模型,通常发生3栽方法:

  • 管世界模型作视图模型来用,也就是是天地模型就是视图模型,大部分都是如此用底。
  • 视图模型中含一个世界模型,定义一个视图模型,里面富含了一个天地模型,通过性能方式展开走访。
  • 拿世界模型映射到视图模型,领域模型并没直接照射到视图模型,需要处理这种映射关系。
  • 把世界模型作视图模型来用,也便是世界模型就是视图模型,大部分且是这样用的。
  • 视图模型中富含一个世界模型,定义一个视图模型,里面含了一个天地模型,通过性能方式进行走访。
  • 以世界模型映射到视图模型,领域模型并从未一直照射到视图模型,需要处理这种映射关系。

   
我们不建议直接将世界模型实体暴露被视图,因为起为数不少微小之处,可能导致你混合业务与代表层的逻辑,无论是领域实体的习性显示还是政工的认证规则,这都是应用程序处理的例外地方。

   
我们无建议直接拿世界模型实体暴露于视图,因为生成百上千薄的远在,可能引致您混合业务及表示层的逻辑,无论是领域实体的特性显示还是工作的印证规则,这还是应用程序处理的差点。

   
直接拿你的领域模型作Conroller上之拍卖参数面临着平安风险,因为Controller或者Model
binder必须确保属性验证和用户不可知改改它要好不能够改的习性(例如,用户手动更新了一个藏匿的输入值,或充实一个外加的属性值,而以此并无是界面及之素,但也刚好领域模型实体的属性,这种高风险叫做“over-posting”),即使对眼前版的领域模型做了不错的说明,领域模型前恐做了改修改,并没出现编译错误或警示,可能引致新的风险。
   
咱俩应避免以前片种植办法将世界模型转换成视图模型,推荐以第三栽方式,定义单独的视图模型类。做这种领域大红鹰葡京会模型到视图模型的变工作是一律种植重复性的工作,已经产生几个器得以帮助而来好这项工作。最常用的一个器就是.NET
社区的开源项目AutoMapper。

   
直接拿你的天地模型作Conroller上的拍卖参数面临着平安风险,因为Controller或者Model
binder必须确保属性验证和用户不能够修改它要好非克改的习性(例如,用户手动更新了一个掩蔽的输入值,或增加一个附加的属性值,而这个并无是界面及之素,但也刚好领域模型实体的属性,这种风险叫做“over-posting”),即使对目前版的领域模型做了无可非议的求证,领域模型前恐做了改动修改,并从未出现编译错误或警示,可能引致新的风险。
   
俺们应避免以前片种植艺术以世界模型转换成视图模型,推荐应用第三种植方法,定义单独的视图模型类。做这种领域模型到视图模型的易工作是如出一辙种植重复性的做事,已经发几单器得以帮助你来成功这项工作。最常用的一个家伙就是.NET
社区的开源项目AutoMapper。

 (私家知道:针对域模型和视图模型,有时候要看现实的事体场景,一般情况下好以上述将DomainModel和ViewModel进行数据映射,以避免有些安全性问题;但是也得以用DomainModel当成ViewModel来行使也是可的,通过当系实现、业务逻辑操作与判及是得保工作安全性的。就是前者为只要拓展判定坐担保安全性。所以,还是看现实业务体系的采取条件及要求来支配采取哪种办法来实现。

 (个人掌握:针对域模型和视图模型,有时候需要看具体的事务场景,一般情形下足随上述将DomainModel和ViewModel进行数量映射,以避免有安全性问题;但是呢得将DomainModel当成ViewModel来用呢是可的,通过以网实现、业务逻辑操作以及判及是得包工作安全性的。就是前者也要是开展判断为保证安全性。所以,还是看现实业务系统的动条件及要求来控制动用哪种方式来兑现。

 

 

文章转载自:http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html

章转载自:http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html

相关文章

admin

网站地图xml地图