Prism 学习:从本地目录加载 Module

Posted 郑兴鹏

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prism 学习:从本地目录加载 Module相关的知识,希望对你有一定的参考价值。

  在 Prism 中,将外部模块加载到主程序有以下几种方式:Code、XAML、配置文件、指定模块目录;其中,如果要使用 Code 方式来加载 Module,则需要将该 Module 引用到当前项目中;而后面两种通过 XAML与配置文件,在原理上大体一致;本文主要讨论第四种方法,即通过指定 Module 所在的目录来加载 Module。

    首先,我们需要在 Bootstrapper 类中重载 CreateModuleCatelog 方法,在该方法中定义一个 DirectoryModuleCatalog 对象,并为其指定 ModulePath,代码如下:

复制代码
        protected override IModuleCatalog CreateModuleCatalog()
        {
            DirectoryModuleCatalog catelog = new DirectoryModuleCatalog();
            catelog.ModulePath = @".\\Modules";
            return catelog;
        }
复制代码

    接下来,我们要把被加载的 Module 所在的类库文件(.dll)复制该在 ModulePath 中指定的文件夹。

    提示:如果你的主项目与 Module 项目在同一个解决方案中,则可以配置 Module 项目的 Build Events,在 Post-build event command line 处填上以下命令:

copy $(TargetDir)$(TargetFileName) "$(SolutionDir)PrismModuleDemo\\$(OutDir)Modules" /Y

    其中 PrismModuleDemo 应该是你的主项目文件夹名称。如下图:

    然后,当我们运行项目时,Prism 就会在指定的文件夹中找出所有的 Module 并将其添加到 ModuleCatelog 中,并完成加载。

按需加载

    在上述情况中,所有在该目录下的模块会在程序启动时,就会被加载。如果要实现按需加载(Loading Modules on Demand),则可以通过更改 Module 类的属性(Attribute)来实现: 

复制代码
    [Module(ModuleName = "ModuleA", OnDemand = true)]
    public class ModuleA : IModule
    {
        public void Initialize()
        {
            // some logic
        }
    }
复制代码

    通过指定 OnDemand = true,则可设定该模块为按需加载。当在程序中需要加载该模块时,可以通过 IModuleManager 的 LoadModule 方法可以将其加载进来:

        private void Button_Click(object sender, RoutedEventArgs e)
        {
            this.ModuleManager.LoadModule("ModuleA");
        }

以上是关于Prism 学习:从本地目录加载 Module的主要内容,如果未能解决你的问题,请参考以下文章

从PRISM开始学WPFPrism-Module?

从PRISM开始学WPFPrism?

Prism 基础知识学习导航功能

Prism 源码解读3-Modules加载

2021-10-13 WPF上位机 64-Prism框架模块化(Module,Dialog)

从资源加载任务栏图标并使用 Prism 注入视图模型