###前言 剛接觸XAF的小伙伴可能會有一個疑惑,XAF中有Model(BusinessObject)、View、Controller,感覺明顯是一個MVC的設計模式,但當你用MVC的設計模式與其對應時,又會發現有一些不一樣,可能這時有小伙伴會想會不會是MVC的變體,因為MVC只是一個設計模式,不同 ...
前言
剛接觸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設計模式的看法。