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