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
正是值得的,它可认为你提供一个纯正表达业务经过的平台,并能够令你飞速传输数据。

    MartinFowler 在 PoEAA 中而且总结介绍了两种 Domain Model。而 埃里克 埃文思 的
Domain Driven Design 一书,则一心专注于 Rich Domain Model
的施行应用和开支进程。

马丁 福勒 在 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担当管理还是将世界模型转换到一个View
Model,那平时称为数据传输对象(DTO)

许多的MVC情势的落到实处也都应用三个View Model或Application
Model的定义,Controller是关系的媒婆,架起世界模型和用户分界面之间的大桥,属于表现层。为了View的轻便性,Controller担任管理还是将世界模型调换到三个View
Model,那通常称为数据传输对象(DTO)。

    DomainModel != ViewModel

<译>10个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”的。

   
另一方面,领域实体恐怕需求多个透过验证的法定的值,所以要求一个在用户分界面包车型大巴圈子模型之间的调换。另二个例证是,用户分界面或然会突显三个滑块,用于用户挑选多少天过后提交他的订单。在这种景况下,视图模型只怕采取二个卡尺头属性来表示,领域模型经常是二个日期值。

lovebet爱博体育,   
视图模型平日只含有领域模型的多个子集,而且只包括分界面上所急需的属性。其它,视图模型大概是多个天地模型树的扁平版本,举例,贰个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

相关文章