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全局选 ...
随机推荐
- 从零开始配置 vim(11)——插件管理
之前我们介绍了基础配置部分和快捷键配置部分.如果你配置了这两个部分,vim已经算是比较好用了.但是作为代码编辑器来讲还是显的比较简陋,用这些配置来完成日常的编码任务会显得力不从心.vim比较强大的一点 ...
- 知识蒸馏相关技术【模型蒸馏、数据蒸馏】以ERNIE-Tiny为例
1.任务简介 基于ERNIE预训练模型效果上达到业界领先,但是由于模型比较大,预测性能可能无法满足上线需求. 直接使用ERNIE-Tiny系列轻量模型fine-tune,效果可能不够理想.如果采用数据 ...
- 守护线程(Python)
import time from threading import Thread def son(): while True: print('in son') time.sleep(1) def so ...
- centos6.5安装MongoDB4.4.23
前言 1.目前MongoDB最新稳定版本是:6.0.8 2.MongoDB 5+和6+版本已不支持centos6.2+系统,参考https://docs.mongoing.com/install-mo ...
- IntPtr 来把指针转换为 Int
由于想得到指针的值,这个时候,不能把指针强制转换为 integer 因为 integer 只适合32位的系统,64位的系统下,需要用 int64, 通过这个函数来转换,就可以屏蔽掉系统是32位 还是 ...
- Java发送mail和C#发送mail
Java发送mail 阿里云邮箱,配置公司邮箱服务器,邮箱地址,授权码(运维同事提供,听说阿里云邮箱的授权码和密码一样),端口465,测试能发送. /** * 发送简单的文本邮件 */ public ...
- Linux-RAID类型介绍、创建、彻底删除
一.RAID(磁盘阵列) 1.1.RAID概念 RAID简称为独立冗余磁盘阵列,把多块独立的物理硬盘按不同的方式组合起来形成一个硬盘组(逻辑硬盘),从而提供比单个硬盘更高的存储性能和提供数据备份技术, ...
- Linux通过fdisk或者parted进行磁盘分区,然后格式化和挂载磁盘
磁盘分区是Linux的常用命令,其中fdisk和parted命令最为常用.但是当磁盘大于2T时,fdisk只能分到2T. 比如4T的磁盘,fdisk只能分2T的主分区出来,parted可以直接分成4T ...
- 从零开始的react入门教程(二),从react组件说到props/state的联系与区别
壹 ❀ 引 在从零开始的react入门教程(一)一文中,我们搭建了第一个属于自己的react应用,并简单学习了jsx语法.jsx写法上与dom标签高度一致,当然我们也知道,本质上这些react元素都是 ...
- SSD 接口简介——SATA/SAS
SSD盘和主机端通过各种各样的接口互联,这里种类比较多,而且有些既是接口又是协议,有些既是接口又是规范,所以很容易一头雾水,于是这篇文章主要目的是梳理好这些不同的概念,只是梳理并不做深入讲解. 一. ...