天地模型(DomainModel)与视图模型(ViewModel)领域模型(DomainModel)与视图模型(ViewModel)

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

   
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。
  • Rich Domain
    Model 包含复杂的,使用持续机制紧密联系在一道的靶子网络,在本书和 GoF
    一书写中牵线的很多模式从在杠杆作用。Rich Domain Models
    往往是柔性的,精心测试了之,不断重构的,而且与它们所发挥的小圈子所需要的工作逻辑严密耦合。
  • Simple Domain Model
    往往是业务对象及多少库表之间一对一之通信。你都显现了之几乎种植模式 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,所有这些跟数据库相关的设计模式 ——
    可以扶持而把与数据库相关的逻辑组织成为一个 Domain
    Model。
  • 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
Fowler 在 PoEAA 中并且省略介绍了片栽 Domain Model。而 Eric Evans 的
Domain Driven Design 一修,则净专注让 Rich Domain Model
的行以以及开进程。

    Martin
Fowler 在 PoEAA 中又省略介绍了点儿种 Domain Model。而 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

    DomainModel != ViewModel

   
DomainModel代表正相应的域,但ViewModel却是吧View的待而创办。这两者之间或许(一般情形下还)是见仁见智的,此外DomainModel是数额增长行为之组合体,是由复杂的变量类型组成的而存有层次。而ViewModel只是由于有String等简单变量类型组成。如果想移除冗余并且爱造成差的ORM代码,可以利用AutoMapper.如果想只要打听又多。

   
DomainModel代表正在相应的域,但ViewModel却是吧View的消而创办。这两者之间或许(一般景象下都)是见仁见智之,此外DomainModel是数量增长行为的组合体,是由复杂的变量类型组成的而具有层次。而ViewModel只是由于一些String等简单变量类型组成。如果想移除冗余并且爱造成差的ORM代码,可以动用AutoMapper.如果想使打听再多。

   
这就是说领域模型(Domain Model
)和视图模型(View Model)有啊两样为?

   
那领域模型(Domain Model
)和视图模型(View Model)有什么不同吧?

   
在ASP.NET MVC的应用程序中时时得好视View
Model,经常我们还认为世界模型和视图模型是跟一个物。这特别是把世界模型包含在数额传对象DTO里的时,例如使用Entity
Framework之类的ORM工具转的实业。在这种状态下,领域模型和视图模型包含的实业非常相像,都是一对简短的CRUD操作。

   
在ASP.NET MVC的应用程序中不时得得看出View
Model,经常我们且觉得世界模型和视图模型是与一个事物。这特别是管世界模型包含在数据传对象DTO里的时段,例如使用Entity
Framework之类的ORM工具转的实业。在这种情形下,领域模型和视图模型包含的实业非常相像,都是有简便的CRUD操作。

   
这些实体有过多性能,有一样或者近乎之称,你可以生爱地映射领域实体对应视图模型中之一个特性。不过,这些相似的性质为可能略有不同,例如类型或者格式。例如,用户填写的用户界面的一个性质,他以视图模型里也许是一个“Nullable”的。

   
这些实体有很多性质,有平等或者接近之名称,你可以十分爱地映射领域实体对应视图模型中之一个性能。不过,这些相似的性质为或略有不同,例如类型或者格式。例如,用户填写的用户界面的一个特性,他以视图模型里可能是一个“Nullable”的。

   
另一方面,领域实体可能需要一个经证实的法定的价值,所以用一个每当用户界面的小圈子模型中的转换。另一个事例是,用户界面可能会见来得一个滑块,用于用户选择多少天过后提交他的订单。在这种景象下,视图模型或应用一个整数性质来代表,领域模型通常是一个日期值。

   
另一方面,领域实体可能用一个经过认证的官方的值,所以需要一个以用户界面的天地模型中的转换。另一个例子是,用户界面可能会见显得一个滑块,用于用户选择多少天之后提交他的订单。在这种场面下,视图模型或以一个整数性来表示,领域模型通常是一个日期值。

   
视图模型通常只是含有领域模型的一个子集,而且只含界面及所要之特性。此外,视图模型或是一个领域模型树的扁平版本,例如,一个Customer实体有一个Address,而就还要是一个总体,它涵盖街道地址,邮政编码,国家等。一个Customer
视图模型用于展示数据,将地址数据拉平填充到视图模型类里。

   
视图模型通常仅包含领域模型的一个子集,而且只有含有界面上所欲的属性。此外,视图模型或是一个天地模型树的扁平本,例如,一个Customer实体有一个Address,而立即同时是一个总体,它含街道地址,邮政编码,国家等。一个Customer
视图模型用于展示数据,将地方数据拉平填充到视图模型类里。

   
此外如果一个View需要而处理几乎只世界模型,View
Model就是当下几乎独Domain
Model的总数。领域模型与视图模型中出那么些一般的地方,我们常干脆就将Domain
Model当作View Model来行使了。
   
上面讨论了世界模型与视图模型的相似性,我们来探都产生几乎栽方式拿世界模型转换为视图模型,通常发生3种植办法:

   
此外要一个View需要而处理几乎单领域模型,View
Model就是就几只Domain
Model的总数。领域模型和视图模型中产生成千上万一般之地方,我们常干脆就是把Domain
Model当作View Model来利用了。
   
上面讨论了世界模型和视图模型的相似性,我们来看望都出几乎栽艺术拿世界模型转换为视图模型,通常有3种方法:

  • 将世界模型作视图模型来用,也即是小圈子模型就是视图模型,大部分且是这样用底。
  • 视图模型中含有一个天地模型,定义一个视图模型,里面富含了一个领域模型,通过性方式开展走访。
  • 拿世界模型映射到视图模型,领域模型并从未直接照射到视图模型,需要处理这种映射关系。
  • 管世界模型作视图模型来用,也即是天地模型就是视图模型,大部分还是这么用之。
  • 视图模型中富含一个领域模型,定义一个视图模型,里面含了一个天地模型,通过性能方式展开走访。
  • 以世界模型映射到视图模型,领域模型并无一直照射到视图模型,需要处理这种映射关系。

   
我们不建议直接将世界模型实体暴露于视图,因为发那么些轻的处,可能引致您混合业务与代表层的逻辑,无论是领域实体的属性显示还是工作的证实规则,这还是应用程序处理的异点。

   
我们不建议直接拿世界模型实体暴露于视图,因为发好多薄的处在,可能致您混合业务以及代表层的逻辑,无论是领域实体的性质显示还是业务的证实规则,这还是应用程序处理的不同方面。

   
直接用你的圈子模型作Conroller上的拍卖参数面临着平安风险,因为Controller或者Model
binder必须保证属性验证和用户不克改其好无可知改改的特性(例如,用户手动更新了一个掩蔽的输入值,或追加一个额外的属性值,而以此并无是界面上之素,但可刚好领域模型实体的特性,这种高风险叫做“over-posting”),即使对时本的世界模型做了不利的征,领域模型前可能做了改变修改,并没有起编译错误或警告,可能致新的风险。
   
咱俩应该避免使前片栽办法将世界模型转换成视图模型,推荐应用第三种植方式,定义单独的视图模型类。开这种领域模型到视图模型的易工作是千篇一律栽重复性的工作,已经发出几乎单器得以协助您来好这项工作。最常用的一个家伙就是.NET
社区的开源项目AutoMapper。

   
直接用你的圈子模型作Conroller上的拍卖参数面临着平安风险,因为Controller或者Model
binder必须保证属性验证和用户不克改其好非克改改的特性(例如,用户手动更新了一个隐身的输入值,或增加一个附加的属性值,而以此并无是界面上的元素,但可凑巧领域模型实体的特性,这种风险叫做“over-posting”),即使对时版本的圈子模型做了科学的说明,领域模型前说不定做了改修改,并没有出现编译错误或警示,可能引致新的风险。
   
咱俩该避免下前少种方法以世界模型转换成视图模型,推荐应用第三种植艺术,定义单独的视图模型类。召开这种领域模型到视图模型的易工作是一律栽重复性的干活,已经出几乎单器得以扶持你来形成这项工作。最常用的一个家伙就是是.NET
社区的开源项目AutoMapper。

 (村办了解:针对域模型和视图模型,有时候需要看具体的业务场景,一般情形下足随上述将DomainModel和ViewModel进行数量映射,以避免有些安全性问题;但是也得以用DomainModel当成ViewModel来行使也是好的,通过在系统实现、业务逻辑操作和判断及是可以保证工作安全性的。就是前者为要开展判定坐担保安全性。所以,还是看现实事务系统的采取条件以及要求来支配使用哪种艺术来实现。

 (个体掌握:针对域模型和视图模型,有时候要看具体的工作场景,一般景象下可以依照上述将DomainModel和ViewModel进行多少映射,以避免有些安全性问题;但是呢足以以DomainModel当成ViewModel来以啊是得的,通过当系贯彻、业务逻辑操作以及判及是可管工作安全性的。就是前者也要是开展判断为保证安全性。所以,还是看具体业务体系的采用环境及要求来决定下哪种办法来促成。

 

 

文章转载自:http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html

章转载自:http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html