受朋友所邀,準備使用Caliburn框架設計項目,這兩天研究了一下這個開源框架,分享一下。
Caliburn是Rob Eisenberg在2009年提出的一個開源框架,可以應用于WPF,Silverlight,WP7等,框架基于MVVM模式,像它的名字一樣,是企業級應用的一把利器。
之前就聽說過這個項目,下載過源碼簡單看了看,代碼注釋很用心,文檔說明也很詳盡。不過似乎有些想法太大,10多個工程,數萬行代碼,欽佩之余沒有看得下去。
顯然作者也聽取到了使用者的反饋,推出了Caliburn.Micro項目,Micro顧名思義,是Caliburn項目的精簡版。重構了Caliburn的代碼,精簡掉了一些不常用的功能,按作者的話來說:
My vision was to take 90% of Caliburn’s features and squash them into 10% of the code.
非常給力的一句話,下面深入Caliburn.Micro,看看它的究竟。
亮點
在細談Caliburn.Micro(簡稱為CM)之前,先來看看它的亮點。
基于WPF的框架有很多,PRism,WAF等,每個框架都有自己側重點,像Prism側重于模塊間的組合,WAF側重于分層設計。通觀CM的設計,它的一些想法如下:
ActionMessage,結合了Blend中的TriggerAction,可以把UI控件中的事件綁定到后臺方法,類似于CallMethodAction。CM對ActionMessage進行了很多擴展,包括可以傳入多個參數,參數支持綁定,可以通過CanExecute作執行前判斷并設置控件的Enable等。Conventions,協定,這個詞聽上去有點虛,其實就是智能匹配的意思。CM制定了一系列匹配的規則,比如說View和ViewModel之間的匹配,綁定時傳入控件名可以找到控件,傳入方法名可以綁定到方法等等。Screen和Conductor,作為一個Presentation的框架,各個UI部件(Widget或者叫Pad)的管理是必不可少的。Screen就是用來表示UI部件的,它定義了一些列UI部件的生命期事件,比如Activated,DeActivated等。Conductor是用來管理Screen的,類似于傳統的Controller,不同的Screen可以用一個Conductor來管理,Conductor也使用了策略模式允許更改對Screen的處理。Coroutines,協同程序,定義了一組程序的執行,簡化了異步編程。比如說在網絡中下載圖片并顯示,通常來說需要顯示BusyIndicator,后臺線程去網絡讀取圖片,讀取成功后Invoke到UI線程,取消BusyIndicator,顯示圖片。CM提供了一個IResult接口,大大的簡化了異步編程,結合ActionMessage,為AOP的擴展提供了可能。配置性和擴展性,CM移除掉了原Caliburn的一些IOC實現,作為一個通用框架,最常用辦法就是使用工廠模式結合配置文件提供可配置性,使用IOC來解耦組件間的依賴。CM默認是使用MEF來做IOC擴展的,你可以自定義Bootstrapper來使用你喜歡的IOC容器,如Unity等。設計時支持(Design-time support),CM中的ActionMessage是繼承自Blend中的TriggerAction的,也就是說可以在Blend編輯ActionMessage,大大方便了使用。評價
CM符合我對于框架設計的期望,精簡,特點鮮明,思路清晰,不過度設計,有很好的擴展性和可測試性。指望一個框架做所有事情是不現實的,用牛刀來殺雞可能殺的爽快,不過學習的時間成本和后期維護成本都很高,目前對CM很有好感,打算下個項目基于CM搞一搞,如果朋友們有更好的經驗和建議也希望多多交流。
新聞熱點
疑難解答