`

【转】使用View Model从表现层分离领域模型

 
阅读更多

【转】http://www.cnblogs.com/shanyou/archive/2010/04/03/1703501.html

 

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。

Rich Domain Model 包含复杂的,使用继承机制紧密联系在一起的对象网络,在本书和 GoF 一书中介绍的众多模式起着杠杆作用。Rich Domain Models 往往是柔性的,精心测试过的,不断重构的,而且与它们所表达的领域所需的业务逻辑紧密耦合。

采用哪种 Domain Model 类型取决于你的应用环境。如果你正在建立的是一个非常简单的表单处理 web 应用,没必要建立 Rich Domain Model。然而,如果你正在编写一个价值数百万的企业内联网架构的核心库,那么努力开发一个 Rich Domain Model 就是值得的,它可以为你提供一个准确表达业务过程的平台,并可以让你快速传输数据。

Martin Fowler 在 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)。

<译>12个asp.net MVC最佳实践针对Model的最佳实践有这么一段:

7–DomainModel != ViewModel

 DomainModel代表着相应的域,但ViewModel却是为View的需要而创建。这两者之间或许(一般情况下都)是不同的,此外DomainModel是数据加上行为的组合体,是由复杂的变量类型组成的并且具有层次。而ViewModel只是由一些String等简单变量类型组成。如果想移除冗余并且容易导致出错的ORM代码,可以使用AutoMapper.如果想要了解更多,我推荐阅读:ASP.NET MVC View Model Patterns.

那么领域模型(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

-----------------------------------------------------------------------------------------------------------

Java 版本的automapper

AutoMapper for Java

Every once in a while, I get a request asking if there’s anything like AutoMapper for the Java platform. For a long time, that answer was “no”. Not anymore!

Jonathan Halterman got in touch with me almost 2 years ago about any kind of AutoMapper-like tools in Java, didn’t like what he saw, and instead built a tool called ModelMapper. Note – this isn’t a port of AutoMapper, it’s a re-imagining of what AutoMapper does, optimized for the Java platform.

Check it out!

http://modelmapper.org/

分享到:
评论

相关推荐

    MVC实现View—controller—Model分离

    MVC(Model-View-Controller)模式是一种经典的软件设计模式,广泛应用于Web开发领域,用于实现应用程序的业务逻辑、用户界面和数据存储之间的分离。这种模式将应用程序的不同部分划分为三个主要组件:模型(Model)...

    Model View Presenter vs Model View Controller

    MVP是一种从Model View Controller演变而来的设计模式,主要目的是增强View和Presenter之间的交互。在MVP模式中: 1. **Model**:模型层负责业务逻辑和数据处理。它不直接与视图交互,而是通过Presenter传递数据。 ...

    Web表现层分离表现与数据方法的探讨

    随着MVC(Model-View-Controller)架构的引入,业务逻辑与表现层得以分离,但这仍然存在一个问题:表现层中的表现与数据仍然混杂在一起。例如,在HTML表单元素中,`value`属性既包含了数据也包含了表现信息,这种...

    关于设计模式MVC(Model View Controller)模型-视图-控制器

    **模型(Model)**是MVC的核心,负责处理业务逻辑和数据管理。模型与数据存储交互,如数据库查询,返回中立的数据,不依赖特定的数据格式。模型的代码可以被多个视图重用,提高代码复用率。 **视图(View)**是用户...

    Qt Model/View Framework学习笔记

    Qt Model/View Framework 是 Qt 4 中引入的一组新的 item view 类,它们使用 model/view 结构来管理数据与表示层的关系。这种结构带来的功能上的分离给了开发人员更大的弹性来定制数据项的表示。 Model/View 结构是...

    PyQt4 Model View Tutorial 源代码

    在PyQt4中,Model/View编程模式是一个核心概念,它分离了数据的逻辑表示和其在用户界面中的显示方式,实现了数据与视图的解耦。下面我们将逐一探讨这些教程源码中涉及的知识点。 1. **模型(Model)**:模型是数据...

    WPF应用程序和Model-View-ViewModel(MVVM)设计模式示例代码VB版

    在软件开发领域,特别是Windows Presentation Foundation(WPF)应用程序开发中,Model-View-ViewModel(MVVM)设计模式是一种广泛采用的架构模式。MVVM模式旨在提高可测试性、可维护性和代码的分离,使得UI(用户...

    QTableView-MODEL VIEW 标准模型实现

    这个体系结构将数据逻辑(Model)与数据显示(View)分离,提供了高度的灵活性和可扩展性。本教程将深入探讨如何利用QTableView结合标准模型(QStandardItemModel)来实现一个高效的表格视图,并通过自定义Model来...

    QTableView-MODEL VIEW 自定义模型实现.rar

    总结起来,"QTableView-MODEL VIEW 自定义模型实现"是一个关于如何在Qt环境中使用自定义数据模型驱动QTableView的教程或示例。通过自定义模型,开发者可以灵活地处理各种复杂的数据源,同时保持Qt的Model/View架构的...

    Qt_Model_View_学习笔记

    随着Qt 4的发布,Qt库引入了一组全新的Item View类,这些类利用Model/View架构来管理数据与其表现层之间的关系。这种架构的核心在于功能上的解耦,使得开发者能够更加灵活地自定义数据项的表现形式,同时为多种数据...

    qt model view Delegate的例子

    Qt 模型视图委托(Model View Delegate)是Qt库中的一个重要组件,它在图形用户界面(GUI)开发中扮演着关键角色,特别是在数据展示和交互方面。模型视图架构是一种设计模式,它将数据(模型)与显示数据的方式...

    Laravel开发-laravel-view-model

    在Laravel框架中,视图模型(View Model)是一个强大的工具,它可以帮助开发者更好地组织和管理视图数据。本文将深入探讨Laravel 5.x版本中的视图模型及其使用方法。 首先,理解视图模型的概念。视图模型是介于控制...

    MVVMDemo--view和model之间的互相更改.rar

    在Android开发中,MVVM(Model-View-ViewModel)架构是一种流行的设计模式,它将应用程序的业务逻辑、用户界面和数据模型分离,提高了代码的可测试性和可维护性。本项目"MVVMDemo--view和model之间的互相更改.rar...

    Model/View实现表格和统计图

    在软件开发领域,尤其是图形用户界面(GUI)的设计中,Model/View架构是一种常见的设计模式,它将数据处理和用户界面展示分离,使得两者可以独立发展和维护。Qt框架是广泛应用的C++库,其中就提供了强大的Model/View...

    codesmith模板(MVC三层数据层模型层逻辑层)

    MVC,即Model-View-Controller,是一种广泛采用的设计模式,用于分离应用程序的数据、表示和控制逻辑。在本模板中,它被扩展为三层架构,包括数据层、模型层和逻辑层,这有助于提高代码的可维护性和可扩展性。 1. ...

    JSP的两种设计模式 Model1和Model2

    JSP的两种设计模式,即Model1和Model2,是Web开发中常见的架构模式,主要用于分离展示层、控制层和业务逻辑层,提高代码的可维护性和可扩展性。 **JSP Model1模式**是最基础的JSP开发模式,主要特点是将业务逻辑、...

    Introduction to Model View Control (MVC)

    其核心思想是将应用程序分为三个主要部分:模型(Model)、视图(View)和控制器(Controller),从而实现业务逻辑、用户界面和控制流程之间的分离。 - **模型(Model)**:负责存储数据和业务规则。它是应用程序的核心,...

    model view_View_QT_mvc_control_model_

    在IT行业中,模型-视图-控制器(Model-View-Controller,MVC)模式是一种广泛应用于软件设计,尤其是用户界面设计的架构模式。Qt库,一个跨平台的应用开发框架,也支持并实现了这一模式。本篇文章将深入探讨“model/...

    pyqt-model-view-framework-overview.pdf

    标题《pyqt-model-view-framework-overview.pdf》表明,这篇文章是对PyQt的模型/视图框架的快速概览。PyQt是一个跨平台的C++和Python应用程序的界面框架,它利用Qt库,后者是一个用于开发GUI应用程序的C++库。 描述...

    qt中的model与view

    框架中还包括了ProxyModel,它作为Model和View之间的中间层,可以用来过滤、排序或分页数据。这样,即使原始Model包含大量数据,用户也可以方便地浏览和操作。 总的来说,Qt的Model/View框架通过MVC模式实现了数据...

Global site tag (gtag.js) - Google Analytics