日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【Prism系列】Module实现程序的插件化

發布時間:2024/3/26 编程问答 50 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【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已經幫我們注冊好的IModuleManagerIRegionManager。然后調用如下兩句:

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实现程序的插件化的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。