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