前言
刚接触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中(也就是充血模型),这样可以提高业务逻辑代码的可重用性。