Prism 源碼解讀3-Modules加載


介紹

在軟件開發過程中,總想組件式的開發方式,各個組件之間最好互不影響,獨立測試。Prism的Modules很好的滿足了這一點。

這個架構圖很好了講解了Prism的Modules的概念

Prism支持通過配置文件,文件夾,手動載入Module的方式,並且對Module的載入進行驗證,包括重復和循環依賴驗證

Prism加載模塊的順序

直接看源碼吧

0、Modules加載

  • Modules的加載主要依靠ModuleCatalog來發現模塊,
  • 通過ModuleManager來加載模塊並對模塊進行驗證以確保模塊的加載順序,
  • ModuleInitializer負責模塊的初始化,包括加載模塊所必須的類和顯示UI Elements等等。

在Prism.PrismApplicationBase 的Initialize方法中調用

1585574598775

創建目錄

1585574672183

RegisterRequiredTypes方法中向容器注入ModuleManager,ModuleInitializer,

1585574816406

最后調用了InitializeModules方法,並在其中調用了ModuleManager的Run方法

1585574852698

看着兩個名字就明白了,第一個是發現模塊並驗證模塊,第二個是加載模塊並初始化。

1585574917778

看一下ModuleCatalogBase的Initialize方法,果然

1585574973443

1585574987953

而驗證就更加有意思了

1585575114834

重復性驗證

1585571571246

通過模塊名字ModuleNames來判斷是否被加載過,,如果存在就拋出異常

加載順序驗證

1585572866324

同時看一下ModuleBase

1585575240730

每當items發生變化都會進行驗證

1585575308583

1585575327939

發現驗證完了來看一下ModuleManage的LoadModulesWhenAvailable方法

1585575416018

1585575456472

1585575508444

1585575521164

看到最終使用了ModuleInitializer來初始化Module。其過程通過Linq實現延遲加載技術。

1585575588013

在這個方法中發現Module必須實現IModle接口。並在這兒調用了RegisterTypes和OnInitialized方法。

模塊的加載看完了,下面來看例子吧

1、通過AppSetting加載

先看一下配置文件

1585575781099

在初始化時

1585575803440

看到重寫了CreateModuleCatalog,前面已經介紹過ModuleCatalog就是控制Module發現和驗證的。

1585575869468

1585575909447

1585575962111

可以看到section的名稱必須是modules。

先解析Module依賴邏輯,最后調用AddModule方法

1585577943221

再ModuleAModule中載入相關的UIElement。

2、通過代碼加載

通過代碼加載就更簡單了,直接在ConfigureModuleCatalog方法中調用默認的ModuleCatalog加載相關的Module就可以了。

1585578152349

在ModuleAModule中代碼不變

這其中的邏輯在0節中已經解釋清楚了,就不在敘述。

3、通過目錄加載

通過目錄加載,如果不看源碼怎么設計,需要創建一個ModuleCatalog,在創建的時候將目錄地址傳入。在內部InnerLoad方法中找到對應目錄,然后通過遍歷程序集找到實現IModule接口的類,加載這個類就可以了。

看了下源碼也正是這么做的

1585578439577

1585578580233

看了源碼發現官方考慮了更多的問題,比如創建了AppDoamin來加載程序集以保證隔離和數據安全。甚至還為其創建了一個InnerModuleInfoLoader類來反射程序集

1585578854546

這樣的指責分配非常好,我們甚至可以寫一個通過網絡來加載Module的ModuleCatalog類。

4、通過手動方式加載

1585579279370

先在ConfigureModuleCatalog中將所有的Module加載進來,並將InitializationMode的方式設置為按需,

1585579366391

那么就可以在需要的時候利用LoadModule方法載入之前加載的Module

1585579427491

1585579463038

值得注意的是並沒有提供卸載Module的接口。

總結

這一篇介紹了下Modules加載的原理,其實就是

  • ModuleCatalog負責發現Module。
  • 通過ModuleManager來加載模塊並對模塊進行驗證以確保模塊的加載順序,
  • ModuleInitializer負責模塊的初始化,包括加載模塊所必須的類和顯示UI Elements等等。

下一篇開始將介紹MVVM的實現。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM