都足以从 Model 请求数据,概念上的 MVC 情势被描述为四个指标 ——

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

   
Model-View-Controller(模型-视图-调整器,MVC)形式将您的软件协会并分解成多少个完全不一致的剧中人物:

Model-View-Controller(模型-视图-调控器,MVC)
格局将您的软件组织并分解成两个精光分歧的剧中人物:

  • Model
    封装了你的运用数据、应用流程和工作逻辑。
  • View
    从 Model 获取数据并格式化数据以进行突显。
  • Controller
    调控程序流程,接收输入,并把它们传递给 Model 和 View。
  • Model 封装了你的行使数据、应用流程和专业逻辑。

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

  • Controller 调节造进程序流程,接收输入,并把它们传递给 Model 和 View。

   
与别的设计方式分化,MVC
格局并从未直接展示一个你能够编写或铺排的类组织。相反,MVC
更像1个定义上的指点原则或范型。概念上的 MVC 形式被描述为三个对象 ——
Model、View 和 Controller —— 之间的关联。由于 View 和 Controller
都得以从 Model 请求数据,所以 Controller 和 View 都凭借Model。任何输入都通过 Controller 进入你的体系,然后 Controller 选择3个View 来发生结果。

与任何设计方式分歧,MVC
方式并不曾向来反映三个您可见编写或布置的类协会。相反,MVC
更像多少个定义上的引导标准或范型。概念上的 MVC 格局被描述为多个对象 ——
Model、View 和 Controller —— 之间的关联。由于 View 和 Controller
都能够从 Model 请求数据,所以 Controller 和 View 都依据Model。任何输入都经过 Controller 进入你的系统,然后 Controller 选拔三个View 来发出结果。

    Model
包蕴了您的应用逻辑和数据,在你的应用程序中,它非常大概是重大的值驱动器。Model
未有别的与表现层相关的性状,而且也和 HTTP
请求管理职务中全然毫无干系。

Model
包罗了你的应用逻辑和多少,在您的应用程序中,它相当大概是必不可少的值驱动器。Model
未有别的与表现层相关的特征,而且也和 HTTP 请求管理职务中全然非亲非故。

    Domain
Model
是2个对象层,是对实际世界逻辑、数据和您应用程序所管理的主题素材的悬空。

Domain Model
是贰个目的层,是对切实世界逻辑、数据和你应用程序所处理的题材的充饥画饼。Domain
Model 可分为两大类:Simple Domain Model 和 Rich Domain Model。

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

Simple Domain Model
往往是业务对象和多少库表之间1对1的通讯。你早已见过的三种格局 —— Active
Record、Table Data Gateway,以及 Data
Mapper,全数那几个与数据库相关的设计格局 ——
可以帮忙你把与数据库相关的逻辑组织成三个 Domain Model。

  • Simple Domain Model
    往往是业务对象和数码库表之间一对一的通讯。你早就见过的二种格局 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,全数这个与数据库相关的设计形式 ——
    能够帮忙您把与数据库相关的逻辑组织成1个 Domain
    Model。
  • Rich Domain
    Model 包涵复杂的,使用持续机制紧凑联系在一齐的对象网络,在本书和 GoF
    1书中介绍的居多形式起着杠杆功效。Rich Domain Models
    往往是柔性的,精心测试过的,不断重构的,而且与它们所表明的领域所需的事体逻辑严酷耦合。

Rich Domain Model
包括复杂的,使用持续机制紧凑联系在一同的目的网络,在本书和 GoF
1书中介绍的广大情势起着杠杆功用。Rich Domain Models
往往是柔性的,精心测试过的,不断重构的,而且与它们所公布的小圈子所需的作业逻辑严格耦合。

   
接纳哪类 Domain
Model 类型取决于你的应用景况。借令你正在创设的是二个特别简单的表单处理web 应用,没须求创设 Rich Domain
Model。但是,如果您正在编纂一个市场股票总值数百万的厂家内联网架构的中坚库,那么拼命付出3个Rich Domain Model
就是值得的,它可以为您提供八个正确表明业务进度的阳台,并得以让您快速传输数据。

运用哪一种 Domain Model
类型取决于你的应用情形。倘使您正在创建的是三个非常轻易的表单管理 web
应用,没必要建构 Rich Domain
Model。但是,假诺您正在编写制定多少个市场总值数百万的商城内联网架构的大旨库,那么拼命开拓二个Rich Domain Model
就是值得的,它可以为你提供1个标准表明业务经过的平台,并得以令你快捷传输数据。

    马丁Fowler 在 PoEAA 中而且总结介绍了三种 Domain Model。而 埃里克 埃文思 的
Domain Driven Design 一书,则统统专注于 Rich Domain Model
的实践应用和开发进度。

马丁 Fowler 在 PoEAA 中并且省略介绍了三种 Domain Model。而 埃里克 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情势的贯彻也都利用2个View Model或Application
Model的定义,Controller是维系的介绍人,架起世界模型和用户分界面之间的桥梁,属于表现层。为了View的轻便性,Controller担负管理依然将世界模型转换到1个View
Model,这一般称为数据传输对象(DTO)。

    DomainModel != ViewModel

<译>10个asp.net
MVC最棒施行
针对Model的一级实施有诸如此类一段:

   
DomainModel代表着相应的域,但ViewModel却是为View的急需而创办。这两个之间只怕(一般景色下都)是例外的,其它DomainModel是数码增进行为的组合体,是由复杂的变量类型组成的相同的时间有所档期的顺序。而ViewModel只是由一些String等简便变量类型组成。即便想移除冗余并且轻松导致出错的O奇骏M代码,能够应用AutoMapper.假设想要理解越多。

7–DomainModel != ViewModel

 *DomainModel代表着相应的域,但ViewModel却是为View的内需而创立。那两者之间或者(一般景况下都)是见仁见智的,其余DomainModel是数据拉长行为的组合体,是由复杂的变量类型组成的还要具备档期的顺序。而ViewModel只是由局地String等简单变量类型组成。要是想移除冗余并且轻松产生出错的O牧马人M代码,可以动用[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之类的O奥迪Q三M工具生成的实体。在这种景况下,领域模型和视图模型包蕴的实业非常相像,都是一对简练的CRUD操作。

那一个实体有成都百货上千性质,有同样或近乎的名号,你能够很轻松地映射领域实体对应视图模型中的2个属性。可是,那个相似的性质也说不定略有差异,举例类型可能格式。譬如,用户填写的用户分界面包车型客车二性子质,他在视图模型里或许是贰个“Nullable”的。另1方面,领域实体大概供给一个透过认证的合法的值,所以须求3个在用户界面包车型大巴世界模型之间的更动。另三个例子是,用户分界面可能会显得叁个滑块,用于用户挑选多少天未来提交他的订单。在这种景观下,视图模型可能应用三个寸头性质来表示,领域模型平时是八个日期值。

视图模型日常只包括领域模型的一个子集,而且只含有分界面上所要求的性质。别的,视图模型只怕是二个天地模型树的扁平版本,比如,3个Customer实体有三个Address,而那又是三个完好,它富含街道地址,邮编,国家等。叁个Customer
视图模型用于体现数据,将地址数据拉平填充到视图模型类里。

其它假若3个View供给同期管理多少个世界模型,View Model就是那多少个Domain
Model的总量。领域模型和视图模型之间有许多一般的地点,我们平时干脆就把Domain
Model当作View Model来使用了。

上边研究了世界模型和视图模型的相似性,我们来看望都有二种艺术把世界模型转变为视图模型,平时有三种形式:

  1. 把世界模型当作视图模型来用,也正是小圈子模型正是视图模型,半数以上都以那般用的。
  2. 视图模型里面富含二个世界模型,定义三个视图模型,里面蕴含了二个领域模型,通过品质方式开始展览走访。
  3. 将世界模型映射到视图模型,领域模型并从未一贯照射到视图模型,需求管理这种映射关系。

咱俩不提议直接把世界模型实体暴露给视图,因为有广大轻微之处,恐怕变成您混合业务和表示层的逻辑,无论是领域实体的属性展现仍然职业的印证规则,这都以应用程序处理的例外方面。间接将你的园地模型作为Conroller上的管理参数面前碰着着平安危害,因为Controller或然Model
binder必须保证属性验证和用户不能够修改她自身不能够改改的属性(譬如,用户手动更新了1个躲藏的输入值,或充实三个非常的属性值,而以此并不是界面上的成分,但却凑巧领域模型实体的个性,这种高风险叫做“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,平常大家都是为世界模型和视图模型是同1个事物。那特别是把世界模型包涵在多少传输对象DTO里的时候,举例使用Entity
Framework之类的O库罗德M工具生成的实业。在这种意况下,领域模型和视图模型包罗的实体极其相似,都以有些大约的CRUD操作。

   
那么些实体有诸多特性,有雷同或近乎的名号,你能够很轻巧地映射领域实体对应视图模型中的二性格能。可是,这一个相似的习性也或然略有不一样,比如类型大概格式。举个例子,用户填写的用户分界面包车型客车一个属性,他在视图模型里只怕是3个“Nullable”的。

   
另一方面,领域实体也许须要一个透过认证的官方的值,所以需求1个在用户界面包车型客车圈子模型之间的转移。另二个例子是,用户分界面或许会展现3个滑块,用于用户选拔多少天过后提交他的订单。在这种处境下,视图模型恐怕应用贰个寸头质量来代表,领域模型平日是一个日期值。

   
视图模型通常只包罗领域模型的二个子集,而且只含有分界面上所须要的性质。其余,视图模型大概是三个世界模型树的扁平版本,举个例子,1个Customer实体有一个Address,而这又是二个完好,它包含街道地址,邮编,国家等。1个Customer
视图模型用于展现数据,将地点数据拉平填充到视图模型类里。

   
别的假使2个View供给同不经常候管理多少个世界模型,View
Model正是那多少个Domain
Model的总的数量。领域模型和视图模型之间有繁多相似的地方,我们日常干脆就把Domain
Model当作View Model来行使了。
   
上边研究了世界模型和视图模型的相似性,我们来看看都有两种格局把世界模型转换为视图模型,平日有三种办法:

  • 把世界模型当作视图模型来用,也正是天地模型正是视图模型,大多数都以这么用的。
  • 视图模型里面包罗1个领域模型,定义二个视图模型,里面含有了2个天地模型,通过品质格局张开走访。
  • 将世界模型映射到视图模型,领域模型并未向来照射到视图模型,须要管理这种映射关系。

   
大家不提出直接把世界模型实体暴光给视图,因为有成都百货上千轻微之处,恐怕引致你混合业务和表示层的逻辑,无论是领域实体的属性展现依旧专业的评释规则,那都是应用程序处理的不相同地点。

   
间接将您的圈子模型作为Conroller上的拍卖参数面前碰着着安全风险,因为Controller只怕Model
binder必须确定保障属性验证和用户不能够改改她要好不能够修改的习性(举例,用户手动更新了二个隐藏的输入值,或充实四个附加的属性值,而这几个并不是分界面上的因素,但却刚刚领域模型实体的性质,这种风险叫做“over-posting”),纵然对现阶段版本的小圈子模型做了合情合理的证实,领域模型现在或者做了改换修改,并不曾出现编写翻译错误恐怕警示,大概产生新的危害。
   
大家应有防止选取前二种艺术将世界模型调换来视图模型,推荐应用第三种格局,定义单独的视图模型类。做这种领域模型到视图模型的退换专门的学问是壹种重复性的办事,已经有多少个工具得以辅助你来成功那项工作。最常用的三个工具便是.NET
社区的开源项目AutoMapper。

 (个体精通:针对域模型与视图模型,一时候供给看现实的事情场景,一般景观下得以依据上述将DomainModel和ViewModel进行数量映射,以免止有个别安全性难题;不过也得以将DomainModel当成ViewModel来选拔也是足以的,通过在系统实现、业务逻辑操作和推断上是足以确定保障专门的学问安全性的。便是前者也要拓展决断以担保卫安全全性。所以,依然看具体育赛职业种类的选择条件与要求来决定动用哪类方法来兑现。

 

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