【Prism系列】Module实现程序的插件化
前言
????????首先區(qū)分Module和model這兩個(gè)單詞。model是之前MVVM提到很多的模型部分。而今天講的是Module:模塊/單元。Module有助于我們將程序分成一個(gè)個(gè)模塊進(jìn)行管理。借助Module我們可以直接完成反射過程,實(shí)現(xiàn)程序的插件化。話不多說進(jìn)入正題。
新建類庫(kù)
? ? ? ? 我們的目的是將常用的模塊進(jìn)行封裝,避免重復(fù)造輪子。
? ? ? ? 首先我們新建一個(gè)wpf的類庫(kù),這種類庫(kù)可以讓我們添加界面。
?我們就命名為SubComLibrary吧。然后為類庫(kù)安裝Prism:(這里通過解決方案進(jìn)行安裝包,可以確保包的版本一致,避免不必要的報(bào)錯(cuò))
然后添加一個(gè)用戶控件LogControl,這個(gè)用戶控件就是我們的常用的公共模塊。?
然后給SubComLibrary添加一個(gè)SubModule的類,給類添加一個(gè)特性,并實(shí)現(xiàn)接口:
[Module(ModuleName = "SubModule", OnDemand = true)] public class SubModule : IModule {public void OnInitialized(IContainerProvider containerProvider){}public void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.RegisterForNavigation<Views.LogControl>();} }這一步非常關(guān)鍵,是該模塊被發(fā)現(xiàn)的關(guān)鍵。
注意,我們?cè)?RegisterTypes 中注冊(cè)了我們的用戶控件。
注意這個(gè)結(jié)構(gòu),是一個(gè)名為?SubModule 的模塊中有個(gè)用戶控件叫做 LogControl。
現(xiàn)在,我們的目錄結(jié)構(gòu)是這樣的,整個(gè)項(xiàng)目按照MVVM模式進(jìn)行構(gòu)建:(Extensions,暫且不用關(guān)心)
?到此我們的類庫(kù)就制作完成。
模塊加載
現(xiàn)在我們需要利用Prism給我們提供的功能,在主體程序中加載剛剛新建的類庫(kù)中的模塊。當(dāng)然主體程序也是基于Prsim的,這個(gè)可以參考之前的Prism系列博客。
首先,我們需要在App中重寫CreateModuleCatalog,并指定加載路徑。
/// <summary> /// Prsim模塊化實(shí)現(xiàn) /// </summary> /// <returns></returns> protected override IModuleCatalog CreateModuleCatalog() {//return base.CreateModuleCatalog(); ?return new DirectoryModuleCatalog() { ModulePath = ".\\Modules" }; }這里的".\\Modules" ,就是我們存放類庫(kù)DLL的地方。所以我們可以在exe根目錄新建一個(gè)Modules的文件夾,然后將SubComLibrary工程生成的dll放入其中。
接下來的兩部很重要,在主體程序中注入:Prism已經(jīng)幫我們注冊(cè)好的IModuleManager和IRegionManager。然后調(diào)用如下兩句:
moduleManager.LoadModule("SubModule"); regionManager.RequestNavigate("MainRegion", "LogControl");第一句表示,加載類庫(kù)中的模塊SubModule。第二局就是將SubModule中的用戶控件LogControl和主界面的Region關(guān)聯(lián)起來,這樣主界面就能動(dòng)態(tài)的加載類庫(kù)中封裝好的類容。
Region,不清楚的可以參考上篇文章:【Prism系列】Region的用法http://t.csdn.cn/h61DP那這里,有出現(xiàn)了一個(gè)問題,如果我需要和這個(gè)控件通信,應(yīng)該怎么做?答案是Prism提供的事件聚合器。我的思路是在新建一個(gè)BaseLibrary,里面可以放一些公共的內(nèi)容,主體程序和子庫(kù)都可以直接引入。比如:
比如,這里我定義了事件以及事件的參數(shù)類型:
?這樣我們?cè)谥黧w程序中使用此事件進(jìn)行發(fā)布,在控件中訂閱此事件,就能實(shí)現(xiàn)他們之間的交互了。
事件聚合器的具體使用,請(qǐng)參考文章:
【Prism系列】Prism事件聚合器http://t.csdn.cn/OU9pD
總結(jié)
Prism提供的Module功能讓我們方便的實(shí)現(xiàn)程序插件化。
1 新建一個(gè)類,讓這個(gè)類實(shí)現(xiàn)接口IModule,并添加特性Module。這樣在Prism框架進(jìn)行掃描時(shí)就能找到這個(gè)類庫(kù)。
2 實(shí)現(xiàn)IModule方法時(shí),將需要關(guān)聯(lián)到主體程序的類進(jìn)行注冊(cè)
3 在主體程序的APP中指定要掃描的類庫(kù)路徑。
4 主體程序中注入IModuleManager,對(duì)類庫(kù)中的模塊進(jìn)行加載
5?主體程序中注入IRegionManager,將模塊中的控件與主體界面的Region進(jìn)行關(guān)聯(lián)。實(shí)現(xiàn)動(dòng)態(tài)載入。
展示
總結(jié)
以上是生活随笔為你收集整理的【Prism系列】Module实现程序的插件化的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 命令行查看BIOS信息与版本
- 下一篇: 有感于猎豹上市