【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实现程序的插件化相关推荐
- 8步安装多多客小程序全插件化1.0开源版
多多客(doodooke)小程序开源版 多多客免费开源的小程序SaaS系统,koa.js + vue.js插件化最佳实践. 安装部署 开发环境安装 1.手动下载zip代码或者使用命令下载git clo ...
- 【Android 插件化】VirtualApp 接入 ( 在 VirtualApp 工程下创建 Module | 添加依赖 | 启动 VirtualApp 插件引擎 )
文章目录 一.在 VirtualApp 工程下创建 Module 二.添加依赖 三.启动 VirtualApp 插件引擎 四.博客源码 一.在 VirtualApp 工程下创建 Module 在 [A ...
- 【Android 插件化】插件化简介 ( 组件化与插件化 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架总结 ( 插件包管理 | Hook Activity 启动流程 | Hook 插件包资源加载 ) ★★★
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( 创建插件应用 | 拷贝插件 APK | 初始化插件包 | 测试插件 DEX 字节码 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】Hook 插件化框架 ( hook 插件化原理 | 插件包管理 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】插件化原理 ( 类加载器 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
- 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )
Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...
最新文章
- Windows Phone 7 网络编程之留言板应用
- Windows 技术篇 - win10复制文件或文件夹时出错,提示“文件或目录损坏且无法读取“问题解决。windows驱动器、磁盘修复方法
- 在SAP Commerce里用SQL查询产品主数据
- 前端需要了解的http知识
- CV Code|计算机视觉开源周报20200601期
- 初识MyBatis-Plus
- bzoj1038 [ZJOI2008]瞭望塔 枚举
- 使用NUnit和Moq测试ASP.NET Core MVC应用程序
- vue-计算属性不能直接修改
- 非计算机专业计算机教学考试,论非计算机专业的计算机教学与等级考试
- 基于oneAPI的OSU MPI Benchmarks 5.7编译安装
- 祭十大已经逝去的软件
- 医院的HIS系统简介
- 谷歌学术Google Scholar超实用干货(拒绝翻墙/插件)
- Python Matplotlib add_subplot 和 subplots_adjust详解及代码详细说明 配图片说明
- 【C】狐狸找兔子问题
- 2022-2028中国蛋白糖果市场现状研究分析与发展前景预测报告
- 使用Faiss来加速计算向量之间的相似度
- 【ENOVIA 服务包】知识重用解决方案 | 达索系统百世慧®
- OSS服务和自建服务器存储对比