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

   
那正是说领域模型(Domain Model
)和视图模型(View Model)有啥差别呢?

Domain Model
是2个对象层,是对切实世界逻辑、数据和您应用程序所管理的难题的割肉医疮。Domain
Model 可分为两大类:Simple Domain Model 和 Rich Domain Model。

    View
用于拍卖全体表现层方面包车型大巴难题。View 从 Model
获取数据,并能够把它格式化成用于 web 页的 HTML,用于 web 服务的
XML,或用来 email 的文件。

<译>十三个asp.net
MVC最好施行
本着Model的特等施行有这么一段:

   
Model-View-Controller(模型-视图-调整器,MVC)格局将您的软件协会并分解成多少个完全差异的角色:

与其他设计情势分裂,MVC
形式并不曾一贯反映二个您能够编写或安顿的类协会。相反,MVC
更像3个概念上的引导标准或范型。概念上的 MVC 格局被描述为四个对象 ——
Model、View 和 Controller —— 之间的关联。由于 View 和 Controller
都能够从 Model 请求数据,所以 Controller 和 View 都依赖Model。任何输入都经过 Controller 进入你的系统,然后 Controller 选拔三个View 来发生结果。

    DomainModel != ViewModel

马丁 Fowler 在 PoEAA 中而且省略介绍了几种 Domain Model。而 Eric Evans的 Domain Driven Design 壹书,则完全专注于 Rich Domain Model
的进行应用和开垦进程。

   
另1方面,领域实体可能需求二个因而认证的官方的值,所以要求二个在用户界面的领域模型之间的调换。另3个例子是,用户分界面恐怕会来得叁个滑块,用于用户挑选多少天过后提交他的订单。在这种景色下,视图模型恐怕行使一个整数性质来表示,领域模型平常是一个日期值。

  • Model 封装了你的运用数据、应用流程和专业逻辑。

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

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

   
选拔哪个种类 Domain
Model 类型取决于你的应用情状。即便您正在建设构造的是四个特别轻巧的表单管理web 应用,没须要创建 Rich Domain
Model。但是,要是你正在编辑1个价值数百万的合营社内联网架构的着力库,那么拼命付出一个Rich Domain Model
正是值得的,它可认为您提供1个标准表明业务经过的阳台,并能够让你飞速传输数据。

Rich Domain Model
包括复杂的,使用持续机制紧凑联系在协同的靶子互联网,在本书和 GoF
壹书中介绍的很多情势起着杠杆成效。Rich Domain Models
往往是柔性的,精心测试过的,不断重构的,而且与它们所发布的圈子所需的业务逻辑严苛耦合。

   
那么些实体有那天特性,有雷同或类似的称呼,你可以很轻巧地映射领域实体对应视图模型中的三特品质。不过,那一个相似的质量也只怕略有分裂,举个例子类型或然格式。举个例子,用户填写的用户分界面的一个属性,他在视图模型里或者是八个“Nullable”的。

7–DomainModel != ViewModel

 *DomainModel代表着相应的域,但ViewModel却是为View的急需而创办。那两者之间或者(一般情况下都)是例外的,别的DomainModel是数量增加行为的组合体,是由复杂的变量类型组成的同期有所档期的顺序。而ViewModel只是由一些String等简便变量类型组成。假设想移除冗余并且轻易产生出错的OCR-VM代码,能够采取[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之类的OENCOREM工具生成的实业。在这种场面下,领域模型和视图模型包括的实体特别相像,都以一些轻巧易行的CRUD操作。

那一个实体有大多性子,有雷同或附近的称呼,你能够很轻松地映射领域实体对应视图模型中的二日质量。可是,那个相似的脾气也只怕略有分歧,举例类型或然格式。举个例子,用户填写的用户分界面包车型客车三个脾性,他在视图模型里恐怕是三个“Nullable”的。另1方面,领域实体也许要求三个因而验证的法定的值,所以须要四个在用户分界面包车型大巴小圈子模型之间的转换。另二个事例是,用户分界面也许会来得3个滑块,用于用户选用多少天之后提交他的订单。在这种情景下,视图模型或者利用1个板寸个性来代表,领域模型平日是一个日期值。

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

除此以外要是贰个View必要同期管理多少个领域模型,View Model正是那一个Domain
Model的总额。领域模型和视图模型之间有十分的多相似的地点,大家平日干脆就把Domain
Model当作View Model来利用了。

地点商量了世界模型和视图模型的相似性,大家来探视都有两种艺术把世界模型转变为视图模型,平日有3种方法:

  1. 把世界模型当作视图模型来用,也正是小圈子模型就是视图模型,超越三分之壹都以那样用的。
  2. 视图模型里面包罗二个领域模型,定义1个视图模型,里面含有了贰个天地模型,通过品质方式展开访问。
  3. 将世界模型映射到视图模型,领域模型并未直接照射到视图模型,供给管理这种映射关系。

我们不提议直接把世界模型实体暴光给视图,因为有众多分寸之处,只怕导致你混合业务和表示层的逻辑,无论是领域实体的品质展现还是业务的注明规则,那都以应用程序管理的不相同地点。直接将您的圈子模型作为Conroller上的拍卖参数面前碰到着安全危机,因为Controller或许Model
binder必须确定保障属性验证和用户不能够改改她要好不能够修改的质量(比如,用户手动更新了三个隐藏的输入值,或追加3个相当的属性值,而那个并不是分界面上的因素,但却刚好领域模型实体的属性,这种风险叫做“over-posting”),尽管对现阶段版本的小圈子模型做了不利的验证,领域模型今后大概做了改动修改,并不曾现身编写翻译错误可能警示,大概形成新的风险。

大家应该防止采纳前三种办法将世界模型调换到视图模型,推荐应用第二种艺术,定义单独的视图模型类。做这种领域模型到视图模型的转移专门的工作是1种重复性的行事,已经有多少个工具得以扶持您来达成那项职业。最常用的多个工具正是.NET
社区的开源项目AutoMapper

 

哪些使用AutoMapper能够参照他事他说加以调查上面包车型地铁两篇小说介绍:

AutoMapper Formatters are Cool – ASP.NET MVC
Style

AutoMapper in NerdDinner

   
DomainModel代表着相应的域,但ViewModel却是为View的要求而创立。那两个之间可能(一般意况下都)是见仁见智的,别的DomainModel是数据增进行为的组合体,是由复杂的变量类型组成的同不平时间具有档期的顺序。而ViewModel只是由一些String等简易变量类型组成。假使想移除冗余并且轻便导致出错的OKoleosM代码,能够选拔AutoMapper.借使想要精晓更加多。

Model
包括了您的应用逻辑和数据,在您的应用程序中,它很只怕是注重的值驱动器。Model
未有此外与表现层相关的特色,而且也和 HTTP 请求处理职分中完全非亲非故。

   
大家不提议直接把世界模型实体暴光给视图,因为有多数细小之处,大概引致您混合业务和表示层的逻辑,无论是领域实体的性质展现依然职业的辨证规则,那都以应用程序处理的两样方面。

View 用于拍卖全部表现层方面包车型地铁难点。View 从 Model
获取数据,并得以把它格式化成用于 web 页的 HTML,用于 web 服务的
XML,或用于 email 的文件。

 

Model-View-Controller(模型-视图-调节器,MVC)
情势将你的软件组织并分解成多个精光不相同的剧中人物:

   
直接将您的小圈子模型作为Conroller上的管理参数面对着安全危害,因为Controller恐怕Model
binder必须保证属性验证和用户不能改改她自身不可能修改的品质(比方,用户手动更新了3个隐身的输入值,或增添三个卓殊的属性值,而那几个并不是分界面上的要素,但却刚好领域模型实体的个性,这种高风险叫做“over-posting”),固然对最近版本的天地模型做了天经地义的证实,领域模型现在恐怕做了变动修改,并从未现身编写翻译错误或然警示,可能导致新的高危机。
   
大家应当防止使用前三种办法将世界模型调换到视图模型,推荐使用第二种艺术,定义单独的视图模型类。做这种领域模型到视图模型的转移职业是一种重复性的劳作,已经有多少个工具得以援救您来产生那项职业。最常用的三个工具便是.NET
社区的开源项目AutoMapper。

使用哪一类 Domain Model
类型取决于你的应用遭受。假若您正在创立的是一个特别简单的表单管理 web
应用,没必要构建 Rich Domain
Model。然则,如若您正在编写制定叁个价值数百万的小卖部内联网架构的主导库,那么拼命开辟2个Rich Domain Model
正是值得的,它可认为你提供1个精确精确表明业务经过的平台,并得以让您快捷传输数据。

    Model
包涵了您的应用逻辑和数目,在你的应用程序中,它很或然是关键的值驱动器。Model
未有别的与表现层相关的特色,而且也和 HTTP
请求管理职务中全然非亲非故。

无数的MVC方式的落到实处也都接纳四个View Model或Application
Model的概念,Controller是关联的媒介,架起世界模型和用户界面之间的大桥,属于表现层。为了View的轻便性,Controller肩负管理也许将世界模型调换来贰个View
Model,那经常可以称作数据传输对象(DTO)。

    Domain
Model
是三个目的层,是对实际世界逻辑、数据和你应用程序所管理的主题素材的指雁为羹。

Simple Domain Model
往往是事情对象和数量库表之间一对1的通信。你早就见过的两种方式 —— Active
Record、Table Data Gateway,以及 Data
Mapper,全数那么些与数据库相关的设计格局 ——
能够协理您把与数据库相关的逻辑协会成叁个 Domain Model。

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

   
视图模型日常只包涵领域模型的一个子集,而且只含有分界面上所急需的属性。其它,视图模型恐怕是1个天地模型树的扁平版本,举个例子,2个Customer实体有三个Address,而那又是三个整机,它含有街道地址,邮编,国家等。一个Customer
视图模型用于显示数据,将地址数据拉平填充到视图模型类里。

    MartinFowler 在 PoEAA 中并且归纳介绍了三种 Domain Model。而 埃里克 埃文思 的
Domain Driven Design 一书,则一心专注于 Rich Domain Model
的进行应用和支付进程。

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

 (个人精晓:针对域模型与视图模型,有时候需求看现实的事体场景,一般情状下得以依据上述将DomainModel和ViewModel进行多少映射,以制止某个安全性难题;不过也足以将DomainModel当成ViewModel来利用也是能够的,通过在系统完结、业务逻辑操作和判别上是足以确认保证专门的工作安全性的。就是前者也要拓展判别以确认保证卫安全全性。所以,照旧看具体育赛事务种类的利用情形与需求来决定动用哪一类格局来达成。

   
在ASP.NET MVC的应用程序中日常能够能够见到View
Model,日常大家都觉着世界模型和视图模型是同三个事物。那非常是把世界模型包蕴在数量传输对象DTO里的时候,举例使用Entity
Framework之类的O智跑M工具生成的实业。在这种景观下,领域模型和视图模型包蕴的实体特别相似,都是部分简单易行的CRUD操作。

  • Model
    封装了您的运用数据、应用流程和事务逻辑。
  • View
    从 Model 获取数据并格式化数据以拓展彰显。
  • Controller
    调节造进度序流程,接收输入,并把它们传递给 Model 和 View。

   
此外要是1个View需求相同的时候管理多少个领域模型,View
Model正是那多少个Domain
Model的总和。领域模型和视图模型之间有为数不少貌似的地点,大家平常干脆就把Domain
Model当作View Model来接纳了。
   
上边研究了世界模型和视图模型的相似性,我们来探望都有两种方法把世界模型调换为视图模型,经常有三种艺术:

  • Simple Domain Model
    往往是工作对象和多少库表之间一对1的通讯。你早就见过的两种情势 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,全体这几个与数据库相关的设计情势 ——
    能够帮衬您把与数据库相关的逻辑协会成贰个 Domain
    Model。
  • Rich Domain
    Model 包括复杂的,使用持续机制紧凑联系在壹块的靶子网络,在本书和 GoF
    一书中牵线的大队人马方式起着杠杆功能。Rich Domain Models
    往往是柔性的,精心测试过的,不断重构的,而且与它们所表明的园地所需的作业逻辑严密耦合。
  • 把世界模型当作视图模型来用,也正是圈子模型正是视图模型,超越4陆%都是如此用的。
  • 视图模型里面富含贰个领域模型,定义二个视图模型,里面包罗了三个天地模型,通过品质方式开始展览访问。
  • 将世界模型映射到视图模型,领域模型并从未一向照射到视图模型,须求管理这种映射关系。

   
很多的MVC情势的达成也都选择多个View Model或Application
Model的概念,Controller是维系的红娘,架起世界模型和用户分界面之间的大桥,属于表现层。为了View的轻巧性,Controller负担管理依旧将世界模型转变来二个View
Model,那日常称为数据传输对象(DTO)

   
与别的设计格局分化,MVC
方式并不曾一直反映一个您能够编写或安插的类组织。相反,MVC
更像八个概念上的辅导规范或范型。概念上的 MVC 格局被描述为四个指标 ——
Model、View 和 Controller —— 之间的涉及。由于 View 和 Controller
都能够从 Model 请求数据,所以 Controller 和 View 都依赖Model。任何输入都因而 Controller 进入你的系统,然后 Controller 选取二个View 来发生结果。

相关文章