澳门蒲京天地模型(DomainModel)与视图模型(ViewModel)领域模型(DomainModel)与视图模型(ViewModel)

概念上的 MVC 模式被描述为三个对象 ——,概念上的 MVC 模式被描述为三个对象 ——

   
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