亚洲必赢bwin696.com与视图模型

   
Model-View-Controller(模型-视图-控制器,MVC)模式将您的软件协会并分解成多少个完全不同的角色:

  • Model
    封装了你的施用数据、应用流程和工作逻辑。
  • View
    从 Model 获取数据并格式化数据以开展显示。
  • Controller
    控制程序流程,接收输入,并把它们传递给 Model 和 View。

   
与任何设计形式不同,MVC
格局并没有从来反映一个你可以编写或配备的类社团。相反,MVC
更像一个概念上的指导标准或范型。概念上的 MVC 情势被描述为两个目的 ——
Model、View 和 Controller —— 之间的涉及。由于 View 和 Controller
都足以从 Model 请求数据,所以 Controller 和 View 都依靠
Model。任何输入都经过 Controller 进入你的系列,然后 Controller 采纳一个
View 来发出结果。

    Model
包含了您的应用逻辑和多少,在你的应用程序中,它很可能是必不可缺的值驱动器。Model
没有任何与表现层相关的特色,而且也和 HTTP
请求处理职责中全然无关。

    Domain
Model
是一个对象层,是对切实世界逻辑、数据和您应用程序所处理的题材的架空。

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

  • Simple Domain Model
    往往是工作对象和数量库表之间一对一的通信。你早就见过的三种形式 ——
    Active Record、Table Data Gateway,以及 Data
    Mapper,所有那多少个与数据库相关的设计情势 ——
    可以帮衬您把与数据库相关的逻辑协会成一个 Domain
    Model。
  • 亚洲必赢bwin696.com,Rich Domain
    Model 包含复杂的,使用持续机制紧密联系在共同的对象网络,在本书和 GoF
    一书中牵线的不在少数形式起着杠杆功用。Rich Domain Models
    往往是柔性的,精心测试过的,不断重构的,而且与它们所表明的世界所需的业务逻辑严密耦合。

   
采取哪类 Domain
Model 类型取决于你的应用环境。如若您正在创制的是一个非常简单的表单处理
web 应用,没必要建立 Rich Domain
Model。然则,如果您正在编写一个价值数百万的小卖部内联网架构的基本库,那么拼命付出一个
Rich Domain Model
就是值得的,它可以为您提供一个可靠表明业务经过的阳台,并可以让你连忙传输数据。

    MartinFowler 在 PoEAA 中并且概括介绍了二种 Domain Model。而 Eric Evans 的
Domain Driven Design 一书,则完全专注于 Rich Domain Model
的履行应用和支付进程。

    View
用于拍卖所有表现层方面的题材。View 从 Model
获取数据,并得以把它格式化成用于 web 页的 HTML,用于 web 服务的
XML,或用来 email 的文书。

   
许多的MVC模式的贯彻也都利用一个View Model或Application
Model的概念,Controller是交流的媒人,架起世界模型和用户界面之间的大桥,属于表现层。为了View的简单性,Controller负责处理仍旧将世界模型转换成一个View
Model,那平时称为数据传输对象(DTO)

    DomainModel != ViewModel

   
DomainModel代表着相应的域,但ViewModel却是为View的急需而创办。这两者之间或许(一般景观下都)是不同的,另外DomainModel是数据增长行为的组合体,是由复杂的变量类型组成的还要具有层次。而ViewModel只是由局部String等简单变量类型组成。假使想移除冗余并且容易导致出错的ORM代码,可以采用AutoMapper.假使想要驾驭更多。

   
这就是说领域模型(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

相关文章