亚洲必赢bwin696.com天地模型(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种植方式:

  • 把世界模型作视图模型来用,也就是世界模型就是视图模型亚洲必赢bwin696.com,大部分都是这般用底。
  • 视图模型中含有一个天地模型,定义一个视图模型,里面富含了一个世界模型,通过性能方式进行访问。
  • 拿世界模型映射到视图模型,领域模型并从未一直照射到视图模型,需要处理这种映射关系。

   
我们不建议直接拿世界模型实体暴露于视图,因为生多薄的处在,可能致您混合业务以及代表层的逻辑,无论是领域实体的性质显示还是业务的证实规则,这还是应用程序处理的差方面。

   
直接以你的圈子模型作Conroller上的拍卖参数面临着平安风险,因为Controller或者Model
binder必须管属性验证和用户不能够改其好非克改的特性(例如,用户手动更新了一个藏匿的输入值,或多一个外加的属于性值,而以此并无是界面及的元素,但却恰巧领域模型实体的习性,这种风险叫做“over-posting”),即使对当前版本的世界模型做了科学的征,领域模型前或做了变动修改,并无出现编译错误或警示,可能引致新的风险。
   
我们应有避免用前少种办法将世界模型转换成视图模型,推荐以第三种植艺术,定义单独的视图模型类。召开这种领域模型到视图模型的变换工作是平等栽重复性的干活,已经生几乎单器得以帮助你来完成这项工作。最常用之一个家伙就是是.NET
社区的开源项目AutoMapper。

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

 

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

相关文章