在軟件開發過程當中,總想組件式的開發方式,各個組件之間最好互不影響,獨立測試。Prism的Modules很好的知足了這一點。安全
這個架構圖很好了講解了Prism的Modules的概念網絡
Prism支持經過配置文件,文件夾,手動載入Module的方式,而且對Module的載入進行驗證,包括重複和循環依賴驗證架構
Prism加載模塊的順序app
直接看源碼吧測試
在Prism.PrismApplicationBase 的Initialize方法中調用ui
建立目錄設計
RegisterRequiredTypes方法中向容器注入ModuleManager,ModuleInitializer,3d
最後調用了InitializeModules方法,並在其中調用了ModuleManager的Run方法blog
看着兩個名字就明白了,第一個是發現模塊並驗證模塊,第二個是加載模塊並初始化。接口
看一下ModuleCatalogBase的Initialize方法,果真
而驗證就更加有意思了
重複性驗證
經過模塊名字ModuleNames來判斷是否被加載過,,若是存在就拋出異常
加載順序驗證
同時看一下ModuleBase
每當items發生變化都會進行驗證
發現驗證完了來看一下ModuleManage的LoadModulesWhenAvailable方法
看到最終使用了ModuleInitializer來初始化Module。其過程經過Linq實現延遲加載技術。
在這個方法中發現Module必須實現IModle接口。並在這兒調用了RegisterTypes和OnInitialized方法。
模塊的加載看完了,下面來看例子吧
先看一下配置文件
在初始化時
看到重寫了CreateModuleCatalog,前面已經介紹過ModuleCatalog就是控制Module發現和驗證的。
能夠看到section的名稱必須是modules。
先解析Module依賴邏輯,最後調用AddModule方法
再ModuleAModule中載入相關的UIElement。
經過代碼加載就更簡單了,直接在ConfigureModuleCatalog方法中調用默認的ModuleCatalog加載相關的Module就能夠了。
在ModuleAModule中代碼不變
這其中的邏輯在0節中已經解釋清楚了,就不在敘述。
經過目錄加載,若是不看源碼怎麼設計,須要建立一個ModuleCatalog,在建立的時候將目錄地址傳入。在內部InnerLoad方法中找到對應目錄,而後經過遍歷程序集找到實現IModule接口的類,加載這個類就能夠了。
看了下源碼也正是這麼作的
看了源碼發現官方考慮了更多的問題,好比建立了AppDoamin來加載程序集以保證隔離和數據安全。甚至還爲其建立了一個InnerModuleInfoLoader類來反射程序集
這樣的指責分配很是好,咱們甚至能夠寫一個經過網絡來加載Module的ModuleCatalog類。
先在ConfigureModuleCatalog中將全部的Module加載進來,並將InitializationMode的方式設置爲按需,
那麼就能夠在須要的時候利用LoadModule方法載入以前加載的Module
值得注意的是並無提供卸載Module的接口。
這一篇介紹了下Modules加載的原理,其實就是
下一篇開始將介紹MVVM的實現。