Prism 源碼解讀1-Bootstrapper和Region的創建

  • 2020 年 3 月 29 日
  • 筆記

介紹

之前也研究過Prism框架但是一直沒有深入理解,現在項目上想把一個Winform的桌面應用程序改造成WPF程序,同時我希望程序是可測試可維護架構良好的,Prism的這些設計理念正好符合我的需求,其主要用於WPF和Xamarin,用於構建松耦合,可維護,可測試的應用程序框架,在我看到源碼後也深受啟發,歡迎大家一起交流探討。

開始

我將從官方的Samples的順序,看介紹中的每個功能是怎麼實現的。

0、PrismApplicationBase

首先介紹一下這個類,這是Startup,這個類中構建了所有的Prism功能和整體的框架。這個類中大多數的方法都是虛方法,可以重載加入自定義的一些功能,Prism也希望我們如此進行設計。

在整個Prism中,UnityContainer無處不再,它就是一個大的容器,保存着所有類,在需要的時候Resolver出來。

1585470691950

有兩個字段,ContainerExtension就UnityContainer,當然也可以自定義其他的容器,在文章中都默認為UnityContainer容器,關於容器也給一個官方說明

ModuleCatalog是定義了加載Module的方式,模塊是Prism的一大優勢,給一張官方說明,意圖勝千言

所有的一切都是從一個類開始PrismApplicationBase,在這個類中加載了Prism的所有功能。

1585471475741

看一下最重要的一個方法,正是在這個方法中完成了大部分功能,其主要工作就是將基礎架構模塊,RequireTypes,RegionAdapterMappings,RegionBehaviors,注入到相應的容器中。

下面幾個方法感受一下

1585471851178

1585471862192

1585471872010

1585471899983

1585471908276

在PrismApplicationBase的子類中看一下

1585472041462

正如我前面所說,重寫某個方法,先調用Base.Method,然後再加入自己功能

對於開發者來說必須重寫的就兩個方法

1585472248282

創建主窗體和RegisterTypes方法,在第二個方法里可以加入我們所必須的一些基礎構建,ContainerRegistry其實就是註冊的Unity容器

1585472365902

下面讓我們愉快的看例子吧。例子都在Prism-Samples-Wpf-master中一共29個,https://github.com/PrismLibrary/Prism-Samples-Wpf

1、BootstrapperShell

1585472950515

1585472994216

看着就是創建了一個Bootstraper然後Run了一下,通過容器創建了主窗體,Show了一下。

看一下如何實現的,其實文章都是在Bootstrapper中

1585473149592

看到這兩個類是不是有一種恍然大悟的感覺,原來Bootstrapper是啥?就是將PrismApplicationBase中的方法全部從Application中抽出來,在這重新實現了一下,難道這就是單一職責原則?

來看一下Run,這些方法太熟悉了吧。

1585473531825

日誌怎麼用,當然是創建然後記錄了,所有的信息都放到資源里,創建的方式有很多種,選擇最簡單的一種new,

1585473705313

2、Regions

這個就是簡單的創建一個Region

1585473969090

一目了然啊,就是在ContentControl中用RegionManager的依賴屬性創建的一個Region。

用經典的三個問題來看看RegionManager,你是誰,你從哪裡來,要到哪裡去。

1585474161899

哦!小夥子你很張狂啊,很強大。看一眼把關了就可以了。

看一眼知道了有一個RegionName依賴屬性,當這個屬性變化的時候調用

1585474975966

IsInDesignMode就是判斷是否在VS的設計模式,調用

1585475107593

哦,還是用了延遲加載,還是用容器創建的,Prism里幾乎所有的類都是通過容器創建的

1585475296411

Behavior?WPF裏面的行為就是服務啊,就是先把一個依賴屬性存着,需要的時候盤它。去看看

1585475415828

很標準的服務。

1585475467136

使用了弱引用,很棒的設計,想想也是如此,

1585475585421

1585475621940

通過Load事件實現延遲加載,嗯,很棒,在界面載入的時候創建Region。

1585475679204

1585475701564

載入觸發一次就好。很喜歡這個單詞WireUp,纏繞,UnWire,

1585475877997

1585476017158

通過名字創建,到RegionAdapterMapping中找到RegionAdapter然後通過Adapter的Initialize創建。

1585476694306

RegionAdapterMapping就是RegionAdapter的集合

1585476749370

1585478744531

1585476852940

先創建Region,然後添加行為

1585477085692

1585476992679

都有哪些行為呢?

1585477032237

創建Region工作完成啦。

看看官方文檔關於Region

3、CustomRegions

想要自定義一個Regin,那肯定要創建一個RegionAdapter,自定義一個StackPanelRegionAdapter

1585477844435

1585477898475

1585477950980

通過剛剛的源碼解讀這些理解起來好像都不困難了。

總結

通過源碼探索了下Bootstapper,Region的創建及如何自定義一個RegionAdapter,輕輕揭開了Prism一點點面紗。後面還有很多的功能和想法,歡迎大家和我一起探討學習。