世界模型(DomainModel)与视图模型(ViewModel)

世界模型(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

admin

网站地图xml地图