前言

首先区分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实现程序的插件化相关推荐

  1. 8步安装多多客小程序全插件化1.0开源版

    多多客(doodooke)小程序开源版 多多客免费开源的小程序SaaS系统,koa.js + vue.js插件化最佳实践. 安装部署 开发环境安装 1.手动下载zip代码或者使用命令下载git clo ...

  2. 【Android 插件化】VirtualApp 接入 ( 在 VirtualApp 工程下创建 Module | 添加依赖 | 启动 VirtualApp 插件引擎 )

    文章目录 一.在 VirtualApp 工程下创建 Module 二.添加依赖 三.启动 VirtualApp 插件引擎 四.博客源码 一.在 VirtualApp 工程下创建 Module 在 [A ...

  3. 【Android 插件化】插件化简介 ( 组件化与插件化 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  4. 【Android 插件化】Hook 插件化框架总结 ( 插件包管理 | Hook Activity 启动流程 | Hook 插件包资源加载 ) ★★★

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  5. 【Android 插件化】Hook 插件化框架 ( 创建插件应用 | 拷贝插件 APK | 初始化插件包 | 测试插件 DEX 字节码 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  6. 【Android 插件化】Hook 插件化框架 ( hook 插件化原理 | 插件包管理 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  7. 【Android 插件化】“ 插桩式 “ 插件化框架 ( 原理与实现思路 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  8. 【Android 插件化】插件化原理 ( 类加载器 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

  9. 【Android 插件化】插件化原理 ( JVM 内存数据 | 类加载流程 )

    Android 插件化系列文章目录 [Android 插件化]插件化简介 ( 组件化与插件化 ) [Android 插件化]插件化原理 ( JVM 内存数据 | 类加载流程 ) [Android 插件 ...

最新文章

  1. Windows Phone 7 网络编程之留言板应用
  2. Windows 技术篇 - win10复制文件或文件夹时出错,提示“文件或目录损坏且无法读取“问题解决。windows驱动器、磁盘修复方法
  3. 在SAP Commerce里用SQL查询产品主数据
  4. 前端需要了解的http知识
  5. CV Code|计算机视觉开源周报20200601期
  6. 初识MyBatis-Plus
  7. bzoj1038 [ZJOI2008]瞭望塔 枚举
  8. 使用NUnit和Moq测试ASP.NET Core MVC应用程序
  9. vue-计算属性不能直接修改
  10. 非计算机专业计算机教学考试,论非计算机专业的计算机教学与等级考试
  11. 基于oneAPI的OSU MPI Benchmarks 5.7编译安装
  12. 祭十大已经逝去的软件
  13. 医院的HIS系统简介
  14. 谷歌学术Google Scholar超实用干货(拒绝翻墙/插件)
  15. Python Matplotlib add_subplot 和 subplots_adjust详解及代码详细说明 配图片说明
  16. 【C】狐狸找兔子问题
  17. 2022-2028中国蛋白糖果市场现状研究分析与发展前景预测报告
  18. 使用Faiss来加速计算向量之间的相似度
  19. 【ENOVIA 服务包】知识重用解决方案 | 达索系统百世慧®
  20. OSS服务和自建服务器存储对比

热门文章

  1. ChatGPT实现大麦抢票脚本
  2. 用打怪游戏实例,深度理解python面向过程
  3. IMX6UL eMMC加锁和解锁代码分析与实现
  4. 计算机语言中脚本的意思,脚本程序是什么意思(mcgs脚本程序编写指南)
  5. 暴力破解工具Hydra
  6. python编译软件和编译环境选择(Windows下,新手看)
  7. 编写一个函数,从一个字符串中去除多余的空格。
  8. I2C驱动_linux
  9. 修改论文格式的方法总结
  10. 大学课程 | 《计算机操作系统》详细知识点总结