前言

刚接触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. nodejs的npm改为国内源和参数

    npm源改为国内 此方法不需要安装cnpm也可以使用淘宝镜像,提高国内访问速度 由于 Node 的官方模块仓库网速太慢,模块仓库需要切换到阿里的源. npm config set registry h ...

  2. SqlSugar的Repository

    1.仓储说明 仓储可以让你的方法更加的规范,需要什么方法都封装到仓储中,下次就能重复使用,并且能很好的和你业务拆分开 这种设计模式简单粗暴用起来也方便 ,文章下面有可以运行的DEMO 2.仓储方法 仓 ...

  3. C++ LibCurl实现Web隐藏目录扫描

    LibCurl是一个开源的免费的多协议数据传输开源库,该框架具备跨平台性,开源免费,并提供了包括HTTP.FTP.SMTP.POP3等协议的功能,使用libcurl可以方便地进行网络数据传输操作,如发 ...

  4. C/C++ 实现常用的线程注入

    各种API远程线程注入的方法,分别是 远程线程注入,普通消息钩子注入,全局消息钩子注入,APC应用层异步注入,ZwCreateThreadEx强力注入,纯汇编实现的线程注入等. 简单编写DLL文件: ...

  5. iOS使用Run Script提升开发效率

    通过在Xcode Run Script添加shell脚本,然后通过脚本来帮助我们在编译阶段完成一下资源的copy,文件替换,修改等繁琐的事件.使Xcode在编译过程中自动完成耗时繁琐的操作提升开发效率 ...

  6. Js文件异步加载

    Js文件异步加载 浏览器中渲染引擎与Js脚本引擎是互斥的,在浏览器开始渲染页面时,如果遇到<script>标签,会停止渲染当前页面,也就是说在脚本加载与执行的过程中会阻塞页面的渲染,在网速 ...

  7. mktemp命令

    mktemp命令 mktemp命令用于安全地创建一个临时文件或目录,并输出其名称,TEMPLATE在最后一个组件中必须至少包含3个连续的X,如果未指定TEMPLATE,则使用tmp.XXXXXXXXX ...

  8. Spring boot集成log4j2

    spring boot默认使用的是logback作为日志框架,那如何使用log4j2呢?下面就给大家介绍一下集成步骤: 此处我使用的是spring boot 2.1.2 1.新建一个spring bo ...

  9. 如何基于three.js(webgl)引擎架构,实现3D密集架库房,3D档案室(3d机器人取档、机器人盘点、人工查档、设备巡检)

     前言: 这是最好的时代,也是最坏的时代:是充满挑战的时代,也是充满机遇的时代.是科技飞速的时代,也是无限可能的时代. 近年来,人工智能(AI)技术的飞速发展已经席卷了全球,不断突破着技术边界,为各行 ...

  10. letcode-两数相除

    题解 设未知数: Br= 125 / 3,拆进行如下拆解: Br = 125 / 3 Br = (29 + 96)/3 Br = 29/3 + (32 * 3) / 3 Br = 29/3 + (2 ...