【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进行关联。实现动态载入。
展示
作者:宋桓公
出处:http://www.cnblogs.com/douzi2/
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!