lovebet爱博体育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
更像一个概念上的引导标准或范型。概念上的 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)福勒 在 PoEAA 中同时省略介绍了三种 Domain Model。而 埃里克(Eric) 埃文思 的
Domain Driven Design 一书,则一心专注于 Rich Domain Model
的执行应用和支付进度。

Martin 福勒 在 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

相关文章