Prism 源碼解讀1-Bootstrapper和Region的創建
- 2020 年 3 月 29 日
- 筆記
介紹
之前也研究過Prism框架但是一直沒有深入理解,現在項目上想把一個Winform的桌面應用程序改造成WPF程序,同時我希望程序是可測試可維護架構良好的,Prism的這些設計理念正好符合我的需求,其主要用於WPF和Xamarin,用於構建松耦合,可維護,可測試的應用程序框架,在我看到源碼後也深受啟發,歡迎大家一起交流探討。
開始
我將從官方的Samples的順序,看介紹中的每個功能是怎麼實現的。
0、PrismApplicationBase
首先介紹一下這個類,這是Startup,這個類中構建了所有的Prism功能和整體的框架。這個類中大多數的方法都是虛方法,可以重載加入自定義的一些功能,Prism也希望我們如此進行設計。
在整個Prism中,UnityContainer無處不再,它就是一個大的容器,保存着所有類,在需要的時候Resolver出來。
有兩個字段,ContainerExtension就UnityContainer,當然也可以自定義其他的容器,在文章中都默認為UnityContainer容器,關於容器也給一個官方說明
ModuleCatalog是定義了加載Module的方式,模塊是Prism的一大優勢,給一張官方說明,意圖勝千言
所有的一切都是從一個類開始PrismApplicationBase,在這個類中加載了Prism的所有功能。
看一下最重要的一個方法,正是在這個方法中完成了大部分功能,其主要工作就是將基礎架構模塊,RequireTypes,RegionAdapterMappings,RegionBehaviors,注入到相應的容器中。
下面幾個方法感受一下
在PrismApplicationBase的子類中看一下
正如我前面所說,重寫某個方法,先調用Base.Method,然後再加入自己功能
對於開發者來說必須重寫的就兩個方法
創建主窗體和RegisterTypes方法,在第二個方法里可以加入我們所必須的一些基礎構建,ContainerRegistry其實就是註冊的Unity容器
下面讓我們愉快的看例子吧。例子都在Prism-Samples-Wpf-master中一共29個,https://github.com/PrismLibrary/Prism-Samples-Wpf
1、BootstrapperShell
看着就是創建了一個Bootstraper然後Run了一下,通過容器創建了主窗體,Show了一下。
看一下如何實現的,其實文章都是在Bootstrapper中
看到這兩個類是不是有一種恍然大悟的感覺,原來Bootstrapper是啥?就是將PrismApplicationBase中的方法全部從Application中抽出來,在這重新實現了一下,難道這就是單一職責原則?
來看一下Run,這些方法太熟悉了吧。
日誌怎麼用,當然是創建然後記錄了,所有的信息都放到資源里,創建的方式有很多種,選擇最簡單的一種new,
2、Regions
這個就是簡單的創建一個Region
一目了然啊,就是在ContentControl中用RegionManager的依賴屬性創建的一個Region。
用經典的三個問題來看看RegionManager,你是誰,你從哪裡來,要到哪裡去。
哦!小夥子你很張狂啊,很強大。看一眼把關了就可以了。
看一眼知道了有一個RegionName依賴屬性,當這個屬性變化的時候調用
IsInDesignMode就是判斷是否在VS的設計模式,調用
哦,還是用了延遲加載,還是用容器創建的,Prism里幾乎所有的類都是通過容器創建的
Behavior?WPF裏面的行為就是服務啊,就是先把一個依賴屬性存着,需要的時候盤它。去看看
很標準的服務。
使用了弱引用,很棒的設計,想想也是如此,
通過Load事件實現延遲加載,嗯,很棒,在界面載入的時候創建Region。
載入觸發一次就好。很喜歡這個單詞WireUp,纏繞,UnWire,
通過名字創建,到RegionAdapterMapping中找到RegionAdapter然後通過Adapter的Initialize創建。
RegionAdapterMapping就是RegionAdapter的集合
先創建Region,然後添加行為
都有哪些行為呢?
創建Region工作完成啦。
看看官方文檔關於Region
3、CustomRegions
想要自定義一個Regin,那肯定要創建一個RegionAdapter,自定義一個StackPanelRegionAdapter
通過剛剛的源碼解讀這些理解起來好像都不困難了。
總結
通過源碼探索了下Bootstapper,Region的創建及如何自定義一個RegionAdapter,輕輕揭開了Prism一點點面紗。後面還有很多的功能和想法,歡迎大家和我一起探討學習。