XAF新手入门 - XAF设计模式探讨
前言
刚接触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设计模式探讨的更多相关文章
- XAF新手入门 - 前言
很多小伙伴在第一次接触XAF时,会被它的丰富功能及开箱即用的特点所吸引,即使在不了解XAF的情况下,也能够依葫芦画瓢创建一个功能丰富的应用,但当应用到实际项目中时,你会发现与之前的愿景差距很大,很多都 ...
- XAF新手入门 - 模块(Module)
模块概述 谈到模块大家应该都不会感到陌生,不管是前端还是后端都有模块的概念,XAF中的模块概念与大多数框架中的模块概念是相通的.XAF模块首先是一个.NET类库,同时它还包含一个继承自ModuleBa ...
- XAF新手入门 - 类型子系统(Types Info Subsystem)
类型子系统概述 类型子系统是XAF的核心概念,但我们平时却很少关注它,它集中存储了模块中的类型,它是生成应用程序模型(Application Model)的基础,它与XAF中其它的概念都有所关联,了解 ...
- 【原创】新手入门一篇就够:从零开发移动端IM
一.前言 IM发展至今,已是非常重要的互联网应用形态之一,尤其移动互联网时代,它正以无与论比的优势降低了沟通成本和沟通代价,对各种应用形态产生了深远影响. 做为IM开发者或即将成为IM开发者的技术人员 ...
- 课程上线 -“新手入门 : Windows Phone 8.1 开发”
经过近1个月的准备和录制,“新手入门 : Windows Phone 8.1 开发”系列课程已经在Microsoft 虚拟学院上线,链接地址为:http://www.microsoftvirtuala ...
- [转载]新手入门:Spring的一些学习方法及意见
原文地址:新手入门:Spring的一些学习方法及意见作者:飞扬飞扬xyz Spring简介: 是一个开源框架,是为了解决企业应用程序开发复杂性而创建的.框架的主要优势之一就是其分层架构,分层架构允许您 ...
- 即时通讯新手入门:一文读懂什么是Nginx?它能否实现IM的负载均衡?
本文引用了“蔷薇Nina”的“Nginx 相关介绍(Nginx是什么?能干嘛?)”一文部分内容,感谢作者的无私分享. 1.引言 Nginx(及其衍生产品)是目前被大量使用的服务端反向代理和负载均衡 ...
- 《IM开发新手入门一篇就够:从零开发移动端IM》
登录 立即注册 TCP/IP详解 资讯 动态 社区 技术精选 首页 即时通讯网›专项技术区›IM开发新手入门一篇就够:从零开发移动端IM 帖子 打赏 分享 发表评论162 想开 ...
- 新手入门指导:Vue 2.0 的建议学习顺序
起步 1. 扎实的 JavaScript / HTML / CSS 基本功.这是前置条件. 2. 通读官方教程 (guide) 的基础篇.不要用任何构建工具,就只用最简单的 <script> ...
- Flume NG Getting Started(Flume NG 新手入门指南)
Flume NG Getting Started(Flume NG 新手入门指南)翻译 新手入门 Flume NG是什么? 有什么改变? 获得Flume NG 从源码构建 配置 flume-ng全局选 ...
随机推荐
- Milvus 2.3.功能全面升级,核心组件再升级,超低延迟、高准确度、MMap一触开启数据处理量翻倍、支持GPU使用!
Milvus 2.3.功能全面升级,核心组件再升级,超低延迟.高准确度.MMap一触开启数据处理量翻倍.支持GPU使用! 1.Milvus 2.3版本全部升级简介 Milvus 2.3.0 不仅包含大 ...
- PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十]
PGL图学习项目合集&数据集分享&技术归纳业务落地技巧[系列十] 1.PGL图学习项目合集 1.1 关于图计算&图学习的基础知识概览:前置知识点学习(PGL)[系列一] :ht ...
- 13.2 外部DirectX绘制实现
在前一节中我们简单介绍了D3D绘制窗体所具备的基本要素,本节将继续探索外部绘制技术的实现细节,并以此实现一些简单的图形绘制功能,首先外部绘制的核心原理是通过动态创建一个新的窗口并设置该窗口属性为透明无 ...
- hadoop-3.0.0-cdh6.3.2源码编译实践
1.编译过程 参考:https://blog.mygallop.cn/2020/10/centos/hadoop-cdh6-compile/ 2.问题记录 CDH6.3.2 Hadoop源码位置发生变 ...
- 私有化部署chatGPT,告别网络困扰
最近的chatGPT是热火朝天,基本人手一个.工具用的好,工作5分钟,划水一整天. 不过最近ChatGPT的访问越来越限制了,访问官网都有网络的问题,今天小卷给大家介绍一个方案,私人独享属于自己的ch ...
- .NET周刊【1月第3期 2024-01-24】
国内文章 .NET开源的简单.快速.强大的前后端分离后台权限管理系统 https://www.cnblogs.com/Can-daydayup/p/17980851 本文介绍了中台Admin,一款基于 ...
- .NET Core 在 K8S 上的开发实践--学习笔记
摘要 本主题受众是架构师,开发人员,互联网企业 IT 运维人员.大纲:1. K8S 对应用的要求:2. .NET Core 上 K8S 的优势:3. K8S 下的 .NET Core 配置:4. .N ...
- Word-批量导出Word中的图片
当我们需要把Word文件中的图片保存起来,你是如何导出Word图片呢?右键一张张保存图片吗?这效率太低了.如果文档中有大量的图片,这个方法会浪费很多时间. 下面给大家分享word如何批量导出图片的技巧 ...
- 扒开源安卓性能测试工具moblieperf源码——开发属于你自己的性能稳定性测试工具
moblieperf下载和使用 moblieperf由阿里巴巴开源的Android性能测试工具 下载:官方源码地址mobileperf github 使用: 使用pycharm打开下载的项目 使用只需 ...
- 【简写MyBatis】01-简单映射器
前言 新开一个坑,为了学习一下MyBatis的源码,写代码是次要的,主要为了吸收一下其中的思想和手法. 目的 关联对象接口和映射类的问题,把 DAO 接口使用代理类,包装映射操作. 知识点 动态代理 ...