概念上的 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。

  • Simple Domain Model
    往往是事情对象和数码库表之间一对一的通信。你曾经见过的二种情势 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,所有这一个与数据库相关的设计情势 ——
    可以帮助您把与数据库相关的逻辑协会成一个 Domain
    Model。
  • Rich Domain
    Model 包含复杂的,使用持续机制紧密联系在协同的靶子网络,在本书和 GoF
    一书中介绍的不少情势起着杠杆效率。Rich Domain Models
    往往是柔性的,精心测试过的,不断重构的,而且与它们所表明的圈子所需的工作逻辑严峻耦合。

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)(Evans) 的
Domain Driven Design 一书,则一心专注于 Rich Domain Model
的实践应用和付出进程。

马丁 福勒(Fowler) 在 PoEAA 中并且省略介绍了二种 Domain Model。而 Eric(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

<译>12个asp.net
MVC最佳实践
针对Model的极品实践有这般一段:

   
DomainModel代表着相应的域,但ViewModel却是为View的需要而创造。这两者之间或许(一般意况下都)是见仁见智的,其余DomainModel是数码增长行为的组合体,是由复杂的变量类型组成的同时有着层次。而ViewModel只是由一些String等简易变量类型组成。如若想移除冗余并且容易导致出错的ORM代码,可以行使AutoMapper.如若想要通晓更多。

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

   
这就是说领域模型(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

相关文章