概念上的 MVC 格局被描述为两个对象 ——,概念上的 MVC 格局被描述为两个对象 ——

   
视图模型日常只含有领域模型的一个子集,而且只含有界面上所需要的特性。另外,视图模型可能是一个世界模型树的扁平版本,例如,一个Customer实体有一个Address,而那又是一个完好无损,它含有街道地址,邮编,国家等。一个Customer
视图模型用于映现数据,将地址数据拉平填充到视图模型类里。

Model
包含了您的应用逻辑和多少,在你的应用程序中,它很可能是必不可缺的值驱动器。Model
没有其他与表现层相关的特性,而且也和 HTTP 请求处理职责中全然无关。

  • Model
    封装了你的利用数据、应用流程和作业逻辑。
  • View
    从 Model 获取数据并格式化数据以开展体现。
  • Controller
    控制程序流程,接收输入,并把它们传递给 Model 和 View。

Model-View-Controller(模型-视图-控制器,MVC)
情势将您的软件社团并分解成多少个精光不同的角色:

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

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

    Domain
Model
是一个对象层,是对切实世界逻辑、数据和您应用程序所处理的题材的虚幻。

马丁 福勒 在 PoEAA 中并且概括介绍了二种 Domain Model。而 Eric Evans(Evans)的 Domain Driven Design 一书,则统统专注于 Rich Domain Model
的推行应用和支出进程。

    马丁福勒(Fowler) 在 PoEAA 中还要省略介绍了二种 Domain Model。而 埃里克(Eric) Evans 的
Domain Driven Design 一书,则统统专注于 Rich Domain Model
的举办应用和付出进程。

  • Model 封装了您的应用数据、应用流程和工作逻辑。

  • View 从 Model 获取数据并格式化数据以开展展示。

  • Controller 控制程序流程,接收输入,并把它们传递给 Model 和 View。

   
那么领域模型(Domain Model
)和视图模型(View Model)有哪些不同吧?

Rich Domain Model
包含复杂的,使用持续机制紧密联系在一起的对象网络,在本书和 GoF
一书中介绍的好多模式起着杠杆成效。Rich Domain Models
往往是柔性的,精心测试过的,不断重构的,而且与它们所发表的天地所需的工作逻辑严俊耦合。

 (民用精通:针对域模型与视图模型,有时候需要看现实的作业场景,一般情状下得以遵照上述将DomainModel和ViewModel举行多少映射,以制止有些安全性问题;不过也足以将DomainModel当成ViewModel来行使也是可以的,通过在系统贯彻、业务逻辑操作和判断上是可以保证工作安全性的。就是前者也要举办判定以保证安全性。所以,仍然看现实业务体系的选用条件与要求来支配使用哪一类方法来促成。

广大的MVC形式的兑现也都使用一个View Model或Application
Model的定义,Controller是关联的媒介,架起世界模型和用户界面之间的桥梁,属于表现层。为了View的简单性,Controller负责处理依然将世界模型转换成一个View
Model,这一般称为数据传输对象(DTO)。

   
在ASP.NET MVC的应用程序中平常可以可以见见View
Model,日常我们都觉得世界模型和视图模型是同一个东西。这特别是把世界模型包含在数据传输对象DTO里的时候,例如利用Entity
Framework之类的ORM工具生成的实业。在这种状况下,领域模型和视图模型包含的实业非常相像,都是一些大概的CRUD操作。

7–DomainModel != ViewModel

 *DomainModel代表着相应的域,但ViewModel却是为View的需要而创造。这两者之间或许(一般情况下都)是见仁见智的,其它DomainModel是数量增长行为的组合体,是由复杂的变量类型组成的还要有所层次。而ViewModel只是由局部String等简易变量类型组成。如若想移除冗余并且容易造成出错的ORM代码,可以使用[AutoMapper](http://www.codeplex.com/AutoMapper).要是想要了解更多,我推荐阅读:[ASP.NET
MVC View Model
Patterns](http://geekswithblogs.net/michelotti/archive/2009/10/25/asp.net-mvc-view-model-patterns.aspx).*

那么领域模型(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种格局:

  1. 把世界模型当作视图模型来用,也就是世界模型就是视图模型,大部分都是这般用的。
  2. 视图模型里面含有一个世界模型,定义一个视图模型,里面包含了一个领域模型,通过性能形式开展访问。
  3. 将世界模型映射到视图模型,领域模型并不曾一贯照射到视图模型,需要处理这种映射关系。

我们不指出直接把世界模型实体表露给视图,因为有成千上万微小之处,可能引致您混合业务和表示层的逻辑,无论是领域实体的特性显示如故工作的辨证规则,这都是应用程序处理的例外方面。直接将你的世界模型作为Conroller上的处理参数面临着安全风险,因为Controller或者Model
binder必须确保属性验证和用户不可能改改她要好不可能修改的属性(例如,用户手动更新了一个藏匿的输入值,或充实一个十分的属性值,而这么些并不是界面上的元素,但却凑巧领域模型实体的特性,那种风险叫做“over-posting”),尽管对眼前版本的天地模型做了不利的注明,领域模型将来可能做了改动修改,并不曾出现编译错误或者警告,可能造成新的高风险。

我们理应制止采用前二种办法将世界模型转换成视图模型,推荐使用第二种艺术,定义单独的视图模型类。做这种领域模型到视图模型的更换工作是一种重复性的办事,已经有几个工具得以帮忙你来成功这项工作。最常用的一个工具就是.NET
社区的开源项目AutoMapper

 

咋样运用AutoMapper能够参见上面的两篇小说介绍:

AutoMapper Formatters are Cool – ASP.NET MVC
Style

AutoMapper in NerdDinner

  • 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
就是值得的,它可以为您提供一个标准表达业务经过的阳台,并可以让你快速传输数据。

   
直接将您的领域模型作为Conroller上的拍卖参数面临着平安风险,因为Controller或者Model
binder必须保证属性验证和用户无法修改她自己不可能改改的性质(例如,用户手动更新了一个东躲西藏的输入值,或追加一个额外的属性值,而这么些并不是界面上的因素,但却刚刚领域模型实体的性能,这种高风险叫做“over-posting”),即使对当前版本的圈子模型做了正确的印证,领域模型以后恐怕做了转移修改,并从未出现编译错误或者警示,可能导致新的风险。
   
咱们理应避免选取前二种艺术将世界模型转换成视图模型,推荐应用第二种模式,定义单独的视图模型类。做这种领域模型到视图模型的转移工作是一种重复性的劳作,已经有多少个工具得以帮忙您来完成这项工作。最常用的一个工具就是.NET
社区的开源项目AutoMapper。

<译>12个asp.net
MVC最佳实践
本着Model的一流实践有如此一段:

   
与此外设计模式不同,MVC
格局并没有直接展现一个您可知编写或配备的类社团。相反,MVC
更像一个定义上的点拨标准或范型。概念上的 MVC 情势被描述为四个对象 ——
Model、View 和 Controller —— 之间的涉嫌。由于 View 和 Controller
都足以从 Model 请求数据,所以 Controller 和 View 都依靠
Model。任何输入都经过 Controller 进入你的系统,然后 Controller 采取一个
View 来暴发结果。

Domain Model
是一个目的层,是对实际世界逻辑、数据和您应用程序所处理的题材的空洞。Domain
Model 可分为两大类:Simple Domain Model 和 Rich Domain Model。

   
其余假若一个View需要同时处理多少个世界模型,View
Model就是这个Domain
Model的总额。领域模型和视图模型之间有很多形似的地点,大家经常干脆就把Domain
Model当作View Model来行使了。
   
上面琢磨了世界模型和视图模型的相似性,大家来探视都有两种格局把世界模型转换为视图模型,通常有3种方法:

与此外设计格局不同,MVC
形式并没有间接呈现一个您可知编写或配备的类社团。相反,MVC
更像一个定义上的点拨标准或范型。概念上的 MVC 形式被描述为六个对象 ——
Model、View 和 Controller —— 之间的涉嫌。由于 View 和 Controller
都能够从 Model 请求数据,所以 Controller 和 View 都依赖Model。任何输入都因此 Controller 进入你的系统,然后 Controller 选用一个
View 来暴发结果。

    Domain
Model 可分为两大类:Simple Domain Model 和 Rich Domain Model。

Simple Domain Model
往往是事情对象和数目库表之间一对一的通信。你已经见过的二种形式 —— Active
Record、Table Data Gateway,以及 Data
Mapper,所有这个与数据库相关的设计形式 ——
可以扶持你把与数据库相关的逻辑社团成一个 Domain Model。

  • 把世界模型当作视图模型来用,也就是小圈子模型就是视图模型,大部分都是这般用的。
  • 视图模型里面含有一个天地模型,定义一个视图模型,里面富含了一个领域模型,通过性能形式开展走访。
  • 将世界模型映射到视图模型,领域模型并不曾直接照射到视图模型,需要处理这种映射关系。

   
采取哪一种 Domain
Model 类型取决于你的应用环境。如若您正在创制的是一个万分简单的表单处理
web 应用,没必要建立 Rich Domain
Model。可是,若是您正在编写一个价值数百万的集团内联网架构的要旨库,那么拼命付出一个
Rich Domain Model
就是值得的,它可以为您提供一个精确表明业务过程的阳台,并可以让你急迅传输数据。

   
我们不提出直接把世界模型实体显露给视图,因为有不少一线之处,可能引致您混合业务和表示层的逻辑,无论是领域实体的习性展现如故工作的印证规则,这都是应用程序处理的不比方面。

   
Model-View-Controller(模型-视图-控制器,MVC)情势将你的软件协会并分解成多少个完全不同的角色:

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

 

    DomainModel != ViewModel

   
这些实体有不少属性,有平等或接近的称号,你可以很容易地映射领域实体对应视图模型中的一个特性。不过,这个相似的性质也可能略有不同,例如类型或者格式。例如,用户填写的用户界面的一个性质,他在视图模型里也许是一个“Nullable”的。

   
DomainModel代表着相应的域,但ViewModel却是为View的急需而创办。这两者之间或许(一般景色下都)是例外的,其余DomainModel是数额增长行为的组合体,是由复杂的变量类型组成的还要存有层次。而ViewModel只是由局部String等简便变量类型组成。如若想移除冗余并且容易造成出错的ORM代码,可以利用AutoMapper.假若想要明白更多。

   
许多的MVC形式的落实也都接纳一个View Model或Application
Model的概念,Controller是维系的介绍人,架起世界模型和用户界面之间的大桥,属于表现层。为了View的简单性,Controller负责处理依然将世界模型转换成一个View
Model,这一般称为数据传输对象(DTO)

    Model
包含了你的应用逻辑和多少,在您的应用程序中,它很可能是重大的值驱动器。Model
没有其他与表现层相关的特性,而且也和 HTTP
请求处理职责中完全无关。

   
另一方面,领域实体可能需要一个通过证实的合法的值,所以需要一个在用户界面的园地模型之间的转换。另一个例证是,用户界面可能会展现一个滑块,用于用户挑选多少天之后提交他的订单。在这种意况下,视图模型可能使用一个整数属性来表示,领域模型平常是一个日期值。

相关文章