【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进行关联。实现动态载入。

展示

posted @   宋桓公  阅读(718)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
点击右上角即可分享
微信分享提示