Model-View-Controller(模型-视图-控制器,MVC)格局将您的软件社团并分解成七个完全不一致的剧中人物:

Model-View-Controller(模型-视图-控制器,MVC)
方式将你的软件协会并分解成八个完全差其他角色:

  • Model
    封装了您的选拔数据、应用流程和事情逻辑。
  • View
    从 Model 获取数据并格式化数据以进行显示。
  • Controller
    控制程序流程,接收输入,并把它们传递给 Model 和 View。
  • Model 封装了你的施用数据、应用流程和事务逻辑。

  • View 从 Model 获取数据并格式化数据以拓展体现。

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

   
与其他设计方式不一致,MVC
形式并不曾直接展现3个您可见编写或布署的类协会。相反,MVC
更像3个定义上的指导规范或范型。概念上的 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。可是,若是您正在编纂3个价值数百万的商号内联网架构的宗旨库,那么拼命付出贰个Rich Domain Model
就是值得的,它可以为你提供多少个纯正表明业务经过的阳台,并可以让你迅速传输数据。

运用哪一种 Domain Model
类型取决于你的应用环境。假如您正在创造的是壹个相当简单的表单处理 web
应用,没要求建立 Rich Domain
Model。然则,倘若您正在编辑一个价值数百万的铺面内联网架构的中央库,那么拼命开发1个Rich Domain Model
就是值得的,它可以为你提供一个精确表达业务经过的阳台,并可以让你火速传输数据。

    MartinFowler 在 PoEAA 中同时省略介绍了三种 Domain Model。而 埃里克 埃文思 的
Domain Driven Design 一书,则统统专注于 Rich Domain Model
的推行应用和支付进程。

Martin Fowler 在 PoEAA 中并且总结介绍了二种 Domain Model。而 埃里克 埃文思的 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负责处理依然将世界模型转换来3个View
Model,这一般称为数据传输对象(DTO)

不可计数的MVC方式的兑现也都应用七个View Model或Application
Model的定义,Controller是关系的媒婆,架起世界模型和用户界面之间的桥梁,属于表现层。为了View的简单性,Controller负责处理依旧将世界模型转换来二个View
Model,那经常称为数据传输对象(DTO)。

    DomainModel != ViewModel

<译>十个asp.net
MVC最佳实践
针对Model的顶级实践有诸如此类一段:

   
DomainModel代表着相应的域,但ViewModel却是为View的内需而成立。那两者之间只怕(一般情形下都)是见仁见智的,其余DomainModel是数量增加行为的组合体,是由复杂的变量类型组成的还要有所层次。而ViewModel只是由局部String等简易变量类型组成。假如想移除冗余并且不难造成出错的OPAJEROM代码,可以利用AutoMapper.如若想要通晓愈来愈多。

7–DomainModel != ViewModel

 *DomainModel代表着相应的域,但ViewModel却是为View的急需而创办。那两者之间可能(一般景色下都)是例外的,别的DomainModel是数据拉长行为的组合体,是由复杂的变量类型组成的同时拥有层次。而ViewModel只是由一些String等简便变量类型组成。若是想移除冗余并且简单导致出错的OEscortM代码,可以采用[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之类的OCR-VM工具生成的实体。在那种景况下,领域模型和视图模型包罗的实业拾壹分相似,都以有的简短的CRUD操作。

那几个实体有好多质量,有一样或近似的名称,你可以很简单地映射领域实体对应视图模型中的2特本性。不过,那几个相似的品质也说不定略有不同,例如类型大概格式。例如,用户填写的用户界面的2性情质,他在视图模型里可能是2个“Nullable”的。另一方面,领域实体只怕须求一个透过证实的合法的值,所以必要一个在用户界面的天地模型之间的更换。另一个例证是,用户界面或然会显得一个滑块,用于用户选用多少天之后提交他的订单。在那种气象下,视图模型或者采纳1个平头品质来表示,领域模型平常是一个日期值。

视图模型平常只含有领域模型的3个子集,而且只包蕴界面上所要求的属性。其余,视图模型或许是三个天地模型树的扁平版本,例如,1个Customer实体有二个Address,而那又是贰个完好无损,它包含街道地址,邮编,国家等。二个Customer
视图模型用于体现数据,将地址数据拉平填充到视图模型类里。

其余借使1个View要求同时处理多少个世界模型,View Model就是那多少个Domain
Model的总和。领域模型和视图模型之间有过多形似的地点,大家日常干脆就把Domain
Model当作View Model来行使了。

上边讨论了世界模型和视图模型的相似性,大家来看看都有两种方法把世界模型转换为视图模型,寻常有3种办法:

  1. 把世界模型当作视图模型来用,也等于天地模型就是视图模型,一大半都以这么用的。
  2. 视图模型里面包蕴多个领域模型,定义1个视图模型,里面含有了2个世界模型,通过质量方式展开访问。
  3. 将世界模型映射到视图模型,领域模型并没有直接照射到视图模型,须要处理那种映射关系。

咱俩不指出直接把世界模型实体暴光给视图,因为有广大微小之处,可能造成您混合业务和表示层的逻辑,无论是领域实体的质量显示依旧业务的认证规则,那都是应用程序处理的差异方面。直接将你的圈子模型作为Conroller上的处理参数面临着安全危害,因为Controller大概Model
binder必须保险属性验证和用户不可以改改她自个儿无法修改的质量(例如,用户手动更新了三个隐藏的输入值,或充实3个十分的属性值,而这些并不是界面上的成分,但却刚好领域模型实体的天性,那种高风险叫做“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奥迪Q5M工具生成的实体。在那种情景下,领域模型和视图模型包蕴的实业非凡相像,都以部分回顾的CRUD操作。

   
这几个实体有那几本性质,有一样或相近的名目,你可以很不难地映射领域实体对应视图模型中的三个属性。但是,这个相似的性质也或然略有差异,例如类型或许格式。例如,用户填写的用户界面的壹特性格,他在视图模型里恐怕是二个“Nullable”的。

   
另一方面,领域实体或然必要二个通过验证的法定的值,所以须要2个在用户界面的园地模型之间的转换。另多个事例是,用户界面只怕会显示3个滑块,用于用户挑选多少天之后提交他的订单。在这种场馆下,视图模型可能采用二个整数属性来表示,领域模型平常是二个日期值。

   
视图模型平时只含有领域模型的一个子集,而且只包涵界面上所需要的质量。其余,视图模型只怕是三个领域模型树的扁平版本,例如,3个Customer实体有2个Address,而这又是三个完全,它含有街道地址,邮政编码,国家等。一个Customer
视图模型用于显示数据,将地址数据拉平填充到视图模型类里。

   
其余假诺3个View须要同时处理多少个世界模型,View
Model就是那多少个Domain
Model的总和。领域模型和视图模型之间有那个一般的地点,大家日常干脆就把Domain
Model当作View Model来使用了。
   
上边研商了世界模型和视图模型的相似性,我们来看望都有二种艺术把世界模型转换为视图模型,平常有3种格局:

  • 把世界模型当作视图模型来用,相当于小圈子模型就是视图模型,一大半都是那般用的。
  • 视图模型里面含有2个天地模型,定义1个视图模型,里面富含了一个世界模型,通过质量情势进行走访。
  • 将世界模型映射到视图模型,领域模型并不曾一向照射到视图模型,要求处理这种映射关系。

   
大家不指出直接把世界模型实体暴光给视图,因为有很多轻微之处,恐怕造成你混合业务和表示层的逻辑,无论是领域实体的习性呈现依旧业务的验证规则,那都以应用程序处理的不等地点。

   
直接将你的领域模型作为Conroller上的处理参数面临着平安危害,因为Controller只怕Model
binder必须有限支撑属性验证和用户无法改改她本人不可以改改的品质(例如,用户手动更新了1个东躲湖北的输入值,或追加二个相当的属性值,而以此并不是界面上的因素,但却凑巧领域模型实体的天性,这种高风险叫做“over-posting”),尽管对当前版本的园地模型做了无可非议的印证,领域模型今后或者做了转移修改,并不曾出现编译错误只怕警示,只怕造成新的高风险。
   
笔者们应当防止采取前三种格局将世界模型转换来视图模型,推荐应用第二种方法,定义单独的视图模型类。做那种领域模型到视图模型的变换工作是一种重复性的干活,已经有多少个工具得以扶持你来成功那项工作。最常用的三个工具就是.NET
社区的开源项目AutoMapper。

 (个体驾驭:针对域模型与视图模型,有时候须求看现实的业务场景,一般意况下得以遵守上述将DomainModel和ViewModel进行数据映射,以免止有个别安全性难点;然则也得以将DomainModel当成ViewModel来接纳也是足以的,通过在系统落成、业务逻辑操作和判断上是足以确保工作安全性的。就是前者也要开展判断以管教安全性。所以,依然看具体作业体系的接纳环境与须要来支配使用哪一类方法来落到实处。

 

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

相关文章

网站地图xml地图