房地产项目世界模型(DomainModel)与视图模型(ViewModel)

   
Model-View-Controller(模型-视图-控制器,MVC)模式将公的软件组织并讲变成三只完全不同之角色:

  • Model
    封作了若的以数据、应用流程和事务逻辑。
  • View
    从 Model 获取数据并格式化数据因进行展示。
  • Controller
    控制次流程,接收输入,并拿它传递让 Model 和 View。

   
与另设计模式不同,MVC
模式并不曾直接体现一个若可知编写或安排的类组织。相反,MVC
更像一个概念上的点标准还是范型。概念上之 MVC 模式于描述为老三单对象 ——
Model、View 和 Controller —— 之间的干。由于 View 和 Controller
都好从 Model 请求数据,所以 Controller 和 View 都因
Model。任何输入还经过 Controller 进入而的系,然后 Controller 选择一个
View 来发出结果。

    Model
包含了公的应用逻辑和数据,在你的应用程序中,它那个可能是根本的值驱动器。Model
没有其余与见层相关的风味,而且为与 HTTP
请求处理职责中了无关。

    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
    往往是柔性的,精心测试了之,不断重构的,而且与它们所发表的圈子所用的政工逻辑严密耦合。

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

    Martin
Fowler 在 PoEAA 中而且概括介绍了点儿种 Domain Model。而 Eric Evans 的
Domain Driven Design 一修,则全专注于 Rich Domain Model
的尽应用和开进程。

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

   
许多的MVC模式之贯彻啊还下一个View Model或Application
Model的概念,Controller是沟通的媒人,架从世界模型与用户界面内的桥梁,属于表现层。为了View的简单性,Controller负责处理或者用世界模型转换成一个View
Model,这一般称为数据传对象(DTO)

    DomainModel != ViewModel

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

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

   
在ASP.NET MVC的应用程序中常可以可以看View
Model,经常我们都以为世界模型和视图模型是与一个事物。这特别是管世界模型包含在多少传对象DTO里的时光,例如利用Entity
Framework之类的ORM工具转的实业。在这种场面下,领域模型和视图模型包含的实业非常相像,都是部分简便的CRUD操作。

   
这些实体有那么些性,有相同或接近之名目,你得十分爱地映射领域实体对应视图模型中之一个性能。不过,这些相似的习性也可能略有不同,例如类型或者格式。例如,用户填写的用户界面的一个特性,他在视图模型里也许是一个“Nullable”的。

   
另一方面,领域实体可能要一个透过验证的官的值,所以待一个每当用户界面的领域模型中的转换。另一个例是,用户界面可能会见来得一个滑块,用于用户挑选多少天之后提交他的订单。在这种情形下,视图模型或采用一个整数属性来代表,领域模型通常是一个日期值。

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

   
此外要一个View需要同时处理几乎单领域模型,View
Model就是立即几只Domain
Model的总数。领域模型与视图模型中有为数不少一般之地方,我们常常干脆就是管Domain
Model当作View Model来采取了。
   
上面讨论了世界模型和视图模型的相似性,我们来瞧都发生几种方法将世界模型转换为视图模型,通常有3种植艺术:

  • 拿世界模型作视图模型来用,也不怕是天地模型就是视图模型,大部分都是如此用之。
  • 视图模型中包含一个天地模型,定义一个视图模型,里面含有了一个世界模型,通过性方式进行走访。
  • 用世界模型映射到视图模型,领域模型并从未直接照射到视图模型,需要处理这种映射关系。

   
我们无建议直接把世界模型实体暴露于视图,因为起为数不少细小的远在,可能致你混合业务以及表示层的逻辑,无论是领域实体的性能显示还是政工的认证规则,这还是应用程序处理的异地方。

   
直接用您的天地模型作Conroller上的拍卖参数面临着平安风险,因为Controller或者Model
binder必须确保属性验证和用户不可知改改其要好无能够修改的习性(例如,用户手动更新了一个藏身的输入值,或加一个格外的属于性值,而者并无是界面及之因素,但却恰巧领域模型实体的习性,这种高风险叫做“over-posting”),即使对当下版本的圈子模型做了科学的说明,领域模型前恐怕做了改观修改,并没出现编译错误或警示,可能造成新的高风险。
   
俺们应当避免使前少种艺术将世界房地产项目模型转换成视图模型,推荐应用第三种植方法,定义单独的视图模型类。做这种领域模型到视图模型的换工作是千篇一律栽重复性的工作,已经发出几乎独器得以帮忙您来好这项工作。最常用的一个家伙就是.NET
社区的开源项目AutoMapper。

 (个体掌握:针对域模型与视图模型,有时候要看现实的业务场景,一般景象下可以依照上述将DomainModel和ViewModel进行多少映射,以避免有安全性问题;但是呢足以以DomainModel当成ViewModel来利用啊是得的,通过当系实现、业务逻辑操作以及判及是可以保证工作安全性的。就是前者为要拓展判断为保安全性。所以,还是看现实事情系统的行使环境和要求来控制用哪种艺术来兑现。

 

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

相关文章