前言

刚接触XAF的小伙伴可能会有一个疑惑,XAF中有Model(BusinessObject)、View、Controller,感觉明显是一个MVC的设计模式,但当你用MVC的设计模式与其对应时,又会发现有一些不一样,可能这时有小伙伴会想会不会是MVC的变体,因为MVC只是一个设计模式,不同的框架会根据自身的特点做一些改变是正常的,带着这个疑惑,我们一起来探讨一下XAF的设计模式。

MVC

MVC设计模式中的M是模型(Model),V是视图(View),C是控制器(Controller),MVC的好处就是将Model与View进行了分离,也就是我们在软件开发中常说的关注点分离,Model负责数据及业务逻辑,View负责数据展示及交互,这样它们也可以被重复使用,Controller会根据用户的请求选择Model,并返回对应的View。

XAF与MVC对比时,两者的View与Model不管是在概念上还是在行为上都是一致的,但Controller却有着不一样的行为。

XAF中Controller的概念比较复杂,不仅有ViewController,还有WindowController等其它Controller,为了简化方便理解,以下所说的XAF中的Controller就是指ViewController(ViewController也是XAF中用到最多的Controller)。

MVC中Controller的作用在前面已说过,同时Controller一般可以拥有多个View,反观XAF中的Controller,不仅行为与MVC中的Controller不同,并且XAF中的View可以同时拥有多个Controller,感觉XAF中的Controller是View的Controller。熟悉XAF的小伙伴看到这里也就明白了,XAF中的Controller就是针对View的,它应该属于View的一部分,同时我们也可以得出结论,XAF中的Model、View、Controller并不是传统的MVC模式。

MVVM

既然XAF不是MVC模式,那是什么模式呢,这里给出我的想法,它是MVVM模式。

MVVM是由Model(M)、View(V)、ViewModel(VM)组成,它们之间的数据传递实现了双向绑定,也就是View中数据的变化会传递给ViewModel,同时ViewModel会更新Model,相反Model中数据的变化会传递给ViewModel,同时ViewModel也会更新View。熟悉XAF的小伙伴会发现XAF中发View与Model(BusinessObject)也是这样工作的,如果你了解WPF,MVVM的概念更不会感到陌生,但这里MVVM更像一个简化版,它没有WPF中Commnad与Service的概念。

上面我们谈到了XAF中的Controller是View的一部分,那Controller与View就是一个整体,我们这里统称为View,而XAF中的Model(BusinessObject)就是ViewModel+Model,看到这里肯定会有小伙伴感到疑惑,XAF中的Model是MVVM中的Model可以理解,它怎么又是ViewModel呢。

这里我们要说一下XPO的PersistentBase类,它是持久化类型必须继承的类,而它继承了INotifyPropertyChanged接口,同时XPCollection类型继承了IBindingList接口,通过这两个接口我们就可以看出XAF中的Model就已具备了ViewModel的特性。

上面我们提到的XAF中的Model都是持久化类型,如果换成非持久化类型,就更容易理解了,NonPersistentObject也继承了INotifyPropertyChanged接口,可以说它就是一个存粹的ViewModel,而MVVM中的Model则来自从外部请求的数据。

XAF中的Controller后面会进行单独的介绍,现在你可以简单的理解为WinForm中Form的逻辑代码,只是XAF对其进行了封装,使其具有可重用性。

其实也不用纠结是什么模式,MVVM也从MVC演变过来的,不管是MVC还是MVVM,Model都是负责数据及业务逻辑的,所以在我们的日常开发中,应该将业务逻辑写在Model中。

在XAF中我们一般将逻辑代码放在Controller或BusinessObject(Model)中,官方也是这样指导我们的,但我们应该再细分一些,与View相关的逻辑代码放在Controller中,与业务相关的逻辑代码放在BusinessObject中(也就是充血模型),这样可以提高业务逻辑代码的可重用性。

写在最后

关于XAF设计模式的分析,只是个人的见解,不一定准确,大家可以在评论区说说你对XAF设计模式的看法。

XAF新手入门 - XAF设计模式探讨的更多相关文章

  1. XAF新手入门 - 前言

    很多小伙伴在第一次接触XAF时,会被它的丰富功能及开箱即用的特点所吸引,即使在不了解XAF的情况下,也能够依葫芦画瓢创建一个功能丰富的应用,但当应用到实际项目中时,你会发现与之前的愿景差距很大,很多都 ...

  2. XAF新手入门 - 模块(Module)

    模块概述 谈到模块大家应该都不会感到陌生,不管是前端还是后端都有模块的概念,XAF中的模块概念与大多数框架中的模块概念是相通的.XAF模块首先是一个.NET类库,同时它还包含一个继承自ModuleBa ...

  3. XAF新手入门 - 类型子系统(Types Info Subsystem)

    类型子系统概述 类型子系统是XAF的核心概念,但我们平时却很少关注它,它集中存储了模块中的类型,它是生成应用程序模型(Application Model)的基础,它与XAF中其它的概念都有所关联,了解 ...

  4. 【原创】新手入门一篇就够:从零开发移动端IM

    一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和沟通代价,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...

  5. 课程上线 -“新手入门 : Windows Phone 8.1 开发”

    经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://www.microsoftvirtuala ...

  6. [转载]新手入门:Spring的一些学习方法及意见

    原文地址:新手入门:Spring的一些学习方法及意见作者:飞扬飞扬xyz Spring简介: 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您 ...

  7. 即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?

    本文引用了“蔷薇Nina”的“Nginx 相关介绍(Nginx是什么?能干嘛?)”一文部分内容,感谢作者的无私分享. 1.引言   Nginx(及其衍生产品)是目前被大量使用的服务端反向代理和负载均衡 ...

  8. 《IM开发新手入门一篇就够:从零开发移动端IM》

        登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页   即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM   帖子 打赏 分享 发表评论162     想开 ...

  9. 新手入门指导:Vue 2.0 的建议学习顺序

    起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...

  10. Flume NG Getting Started(Flume NG 新手入门指南)

    Flume NG Getting Started(Flume NG 新手入门指南)翻译 新手入门 Flume NG是什么? 有什么改变? 获得Flume NG 从源码构建 配置 flume-ng全局选 ...

随机推荐

  1. ChatGPT 中,G、P、T 分别是什么意思?

    流行的技术名词按发音难度排序,ChatGPT 肯定排在前面. 到底它为什么叫做 ChatGPT 呢? 先说 GPT:Generative Pre-Training Transformer Genera ...

  2. ARKit的理解与使用

    AR概述 AR的意义:让虚拟世界套与现实世界建立联系,并可以进行互动. AR的技术实现:通过实时地计算摄影机输出影像的位置及角度,并在内部通过算法识别将场景中的事物,然后在内部模拟的三维坐标系中给识别 ...

  3. laravel生成二维码,并添加背景图片,图标logo

    1.安装组件 composer require simplesoftwareio/simple-qrcode 1.3.* 在 config/app.php 注册服务提供者: SimpleSoftwar ...

  4. 8.类--《Python编程:从入门到实践》

    8.1 创建类 根据约定,在Python中,首字母大写的名称指的是类. 这个类定义中的括号是空的,因为我们要从空白创建这个类.在Python 2.7中创建类时,需要做细微的修改--在括号内包含单词ob ...

  5. 文心一言 VS 讯飞星火 VS chatgpt (197)-- 算法导论14.3 5题

    五.用go语言,对区间树 T 和一个区间 i ,请修改有关区间树的过程来支持新的操作 INTERVALSEARCH-EXACTLY(T,i) ,它返回一个指向 T 中结点 x 的指针,使得 x.int ...

  6. JS Leetcode 179. 最大数 题解分析,sort a-b与b-a的区别,sort排序原理解析

    壹 ❀ 引 今天的题目来自LeetCode179. 最大数,题目描述如下: 给定一组非负整数 nums,重新排列每个数的顺序(每个数不可拆分)使之组成一个最大的整数. 注意:输出结果可能非常大,所以你 ...

  7. 解锁Mysql中的JSON数据类型,怎一个爽字了得

    引言 在实际业务开发中,随着业务的变化,数据的复杂性和多样性不断增加.传统的关系型数据库模型在这种情况下会显得受限,因为它们需要预先定义严格的数据模式,并且通常只能存储具有相同结构的数据.而面对非结构 ...

  8. VUE2的前端学习笔记

    名词笔记 Node node.js 是一切的基础, 其他的名词都是基于这个运行的, 相当于一个JavaScript的容器或者虚机 NPM 安装node.js时赠送的包管理器, 类似于apt, yum, ...

  9. idea自定义代码片段live template

    1.介绍 有时在idea编辑器经常会写同一个代码块,那么这个代码块就可以利用live template功能把它定义成可根据关键字触发的代码片段,效果如下图: 2.操作步骤 此处我们就以springbo ...

  10. AppBox快速开发框架(开源)开发流程介绍

    pre { overflow-y: auto; max-height: 300px }   目前很多低代码平台都是基于Web用拖拽方式生成界面,确实可以极大的提高开发效率,但也存在一些问题: 大部分平 ...