概念上的 MVC 格局被描述为三个对象 ——,都足以从 Model 请求数据

   
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
更像2个概念上的带领标准或范型。概念上的 MVC 形式被描述为八个目的 ——
Model、View 和 Controller —— 之间的关系。由于 View 和 Controller
都可以从 Model 请求数据,所以 Controller 和 View 都注重Model。任何输入都因而 Controller 进入你的体系,然后 Controller 选拔贰个View 来发生结果。

    Model
包罗了您的应用逻辑和多少,在你的应用程序中,它很或然是注重的值驱动器。Model
未有任何与表现层相关的特点,而且也和 HTTP
请求管理职务中全然非亲非故。

Model
包涵了你的应用逻辑和数目,在你的应用程序中,它很也许是不可缺少的值驱动器。Model
未有别的与表现层相关的性格,而且也和 HTTP 请求管理任务中全然非亲非故。

    Domain
Model
是3个目标层,是对实际世界逻辑、数据和你应用程序所管理的主题素材的架空。

Domain Model
是叁个指标层,是对现实世界逻辑、数据和你应用程序所拍卖的难点的空洞。Domain
Model 可分为两大类:Simple Domain Model 和 Rich Domain Model。

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

Simple Domain Model
往往是事情对象和数量库表之间壹对1的通讯。你曾经见过的三种形式 —— Active
Record、Table Data Gateway,以及 Data
Mapper,全数这几个与数据库相关的设计方式 ——
能够帮助您把与数据库相关的逻辑协会成2个 Domain Model。

  • Simple Domain Model
    往往是职业对象和数据库表之间一对一的通讯。你早已见过的二种格局 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,全数那几个与数据库相关的设计情势 ——
    可以扶助你把与数据库相关的逻辑组织成四个 Domain
    Model。
  • Rich Domain
    Model 包涵复杂的,使用持续机制紧凑联系在联合签名的指标网络,在本书和 GoF
    1书中介绍的不少形式起着杠杆作用。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。不过,假若您正在编写1个价值数百万的公司内联网框架结构的为主库,那么拼命开采二个Rich Domain Model
便是值得的,它可感觉你提供3个准确表明业务经过的阳台,并可以令你迅速传输数据。

    MartinFowler 在 PoEAA 中同时省略介绍了三种 Domain Model。而 埃里克 Evans 的
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情势的贯彻也都施用3个View Model或Application
Model的概念,Controller是联系的媒介,架起世界模型和用户分界面之间的大桥,属于表现层。为了View的轻易性,Controller担负管理依然将世界模型转变到3个View
Model,这一般称为数据传输对象(DTO)

重重的MVC情势的落实也都使用1个View Model或Application
Model的定义,Controller是调换的红娘,架起世界模型和用户分界面之间的桥梁,属于表现层。为了View的轻易性,Controller担当管理照旧将世界模型转变到2个View
Model,这一般称为数据传输对象(DTO)。

    DomainModel != ViewModel

<译>十三个asp.net
MVC最棒实施
针对Model的最好施行有那般一段:

   
DomainModel代表着相应的域,但ViewModel却是为View的内需而创立。那两个之间也许(一般情状下都)是分化的,其余DomainModel是数额增进行为的组合体,是由复杂的变量类型组成的同时有着档案的次序。而ViewModel只是由一些String等简单变量类型组成。假如想移除冗余并且轻便导致出错的O路虎极光M代码,能够选用AutoMapper.假诺想要驾驭更加多。

7–DomainModel != ViewModel

 *DomainModel代表着相应的域,但ViewModel却是为View的急需而创办。那两个之间只怕(一般景色下都)是例外的,别的DomainModel是数量拉长行为的组合体,是由复杂的变量类型组成的同时有所档次。而ViewModel只是由局地String等简便变量类型组成。借使想移除冗余并且轻巧导致出错的OLX570M代码,能够行使[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之类的OKugaM工具生成的实体。在这种景色下,领域模型和视图模型包蕴的实业特别相似,都以有的简便的CRUD操作。

这个实体有无数属性,有一样或近似的名称,你能够很轻巧地映射领域实体对应视图模型中的1特性质。不过,这几个相似的特性也大概况有不一致,举个例子类型可能格式。比如,用户填写的用户分界面包车型大巴2个属性,他在视图模型里恐怕是1个“Nullable”的。另一方面,领域实体大概必要3个通过验证的法定的值,所以须要3个在用户分界面包车型大巴园地模型之间的转变。另2个事例是,用户分界面或许会议及展览示一个滑块,用于用户挑选多少天之后提交他的订单。在这种场地下,视图模型恐怕接纳多少个整数属性来表示,领域模型常常是一个日期值。

视图模型平日只包罗领域模型的三个子集,而且只含有分界面上所需求的习性。其余,视图模型可能是3个世界模型树的扁平版本,比如,叁个Customer实体有二个Address,而那又是三个完完全全,它涵盖街道地址,邮编,国家等。一个Customer
视图模型用于体现数据,将地点数据拉平填充到视图模型类里。

除此以外假若三个View供给同时管理多少个世界模型,View Model正是那多少个Domain
Model的总额。领域模型和视图模型之间有为数不少形似的地点,大家平日干脆就把Domain
Model当作View Model来行使了。

下边商讨了世界模型和视图模型的相似性,大家来看看都有三种方法把世界模型调换为视图模型,日常有3种办法:

  1. 把世界模型当作视图模型来用,也正是圈子模型正是视图模型,半数以上都是如此用的。
  2. 视图模型里面包罗二个领域模型,定义二个视图模型,里面含有了1个世界模型,通过质量格局展开走访。
  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之类的OKoleosM工具生成的实业。在这种情形下,领域模型和视图模型包括的实业非常相像,都以一些简易的CRUD操作。

   
这几个实体有为数不少性质,有一样或相近的名目,你能够很轻松地映射领域实体对应视图模型中的二个属性。可是,这几个相似的属性也也许略有分裂,比如类型或许格式。比方,用户填写的用户分界面包车型客车3个天性,他在视图模型里或许是1个“Nullable”的。

   
另1方面,领域实体恐怕须求叁个经过验证的法定的值,所以要求1个在用户分界面包车型地铁园地模型之间的转移。另2个事例是,用户分界面大概会彰显三个滑块,用于用户挑选多少天之后提交他的订单。在这种景况下,视图模型或然使用三个整数属性来表示,领域模型平日是一个日期值。

   
视图模型平日只包含领域模型的贰个子集,而且只含有界面上所急需的天性。别的,视图模型或者是2个天地模型树的扁平版本,比如,一个Customer实体有八个Address,而那又是三个完整,它包蕴街道地址,邮编,国家等。多个Customer
视图模型用于显示数据,将地点数据拉平填充到视图模型类里。

   
其余若是2个View必要同时管理多少个世界模型,View
Model正是这一个Domain
Model的总额。领域模型和视图模型之间有繁多形似的地方,大家平常干脆就把Domain
Model当作View Model来行使了。
   
上面钻探了世界模型和视图模型的相似性,大家来看看都有三种方法把世界模型调换为视图模型,平时有三种办法:

  • 把世界模型当作视图模型来用,也正是圈子模型即是视图模型,超过半数都以如此用的。
  • 视图模型里面富含1个世界模型,定义1个视图模型,里面包涵了叁个领域模型,通过品质格局开始展览走访。
  • 将世界模型映射到视图模型,领域模型并从未向来照射到视图模型,须要管理这种映射关系。

   
我们不提议直接把世界模型实体暴光给视图,因为有不胜枚举细小之处,恐怕导致你混合业务和表示层的逻辑,无论是领域实体的质量彰显照旧政工的验证规则,那都以应用程序管理的区别地点。

   
直接将您的小圈子模型作为Conroller上的拍卖参数面对着安全风险,因为Controller可能Model
binder必须确定保证属性验证和用户不能够修改她要好不可能修改的习性(举个例子,用户手动更新了一个藏匿的输入值,或充实贰个附加的属性值,而这一个并不是分界面上的成分,但却刚刚领域模型实体的性质,这种风险叫做“over-posting”),尽管对如今版本的天地模型做了科学的表明,领域模型今后大概做了变动修改,并未现身编写翻译错误也许警告,只怕引致新的危害。
   
咱俩应有防止使用前三种方法将世界模型转变来视图模型,推荐应用第二种办法,定义单独的视图模型类。做这种领域模型到视图模型的调换专门的学业是壹种重复性的干活,已经有多少个工具得以协助您来完毕那项工作。最常用的三个工具正是.NET
社区的开源项目AutoMapper。

 (村办领悟:针对域模型与视图模型,不常候须要看具体的专业场景,一般情况下能够遵照上述将DomainModel和ViewModel进行数据映射,以制止有个别安全性难题;可是也能够将DomainModel当成ViewModel来利用也是足以的,通过在系统贯彻、业务逻辑操作和推断上是能够保证专门的学问安全性的。就是前者也要实行推断以担保卫安全全性。所以,还是看现实职业种类的运用条件与须求来支配使用哪种艺术来兑现。

 

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

相关文章