根据需要从多个点加载模块

本文关键字:加载 模块 | 更新日期: 2023-09-27 17:51:19

我正在使用IModuleManager按需实现Unity PRISM模块。假设有多个点需要模块的功能。我是否可以在这些点上调用moduleManager.LoadModule("MyModule"),即使模块之前可能已经加载?它不会重新加载,对吧?

这是最佳实践吗?

谢谢

根据需要从多个点加载模块

当你看Prism模块化快速入门

你会发现这个方法负责加载Module

    protected override void OnMouseLeftButtonUp(MouseButtonEventArgs e)
    {
        base.OnMouseLeftButtonUp(e);
        if (!e.Handled)
        {
            if ((this.moduleTrackingState != null) && (this.moduleTrackingState.ExpectedInitializationMode == InitializationMode.OnDemand) && (this.moduleTrackingState.ModuleInitializationStatus == ModuleInitializationStatus.NotStarted))
            {
                this.RaiseRequestModuleLoad();
                e.Handled = true;
            }
        }
    }

请注意,当ModuleInitializationStatus不是ModuleInitializationStatus.NotStarted时,有一个条件阻止调用this.RaiseRequestModuleLoad();

我试图删除它,发现如下:

  1. 多次调用moduleManager.LoadModule("YourModule");不会抛出异常

  2. 模块的Initialize方法只在第一次加载模块时调用。

模块加载意味着模块集合从磁盘转移到内存中。所以…如果每次都重装的话你真的不应该这样做。只是为了回答你的问题"这是最佳实践吗"我不得不说……这绝对不是。我无法告诉你每次调用moduleManager.LoadModule("YourModule");时它是否重新加载,但IMHO你应该只加载模块一次,因为它们也这样做一次。

同意Viktor的意见,这个线程中的响应建议不要调用LoadModule,而是使用IModuleCatalog和IModuleManager来检查ModuleState。

下面是那篇文章的代码片段:

(...)
 var module = this.moduleCatalog.Modules.FirstOrDefault(m => m.ModuleName == "MyModule");
            if (module != null)
            {
                if (module.State != ModuleState.Initialized)
                {
                    moduleManager.LoadModuleCompleted += moduleManager_LoadModuleCompleted;
                    moduleManager.LoadModule("MyModule");
                }
                else
                {
                    //Initialization logic
                }
            }
        }
        void moduleManager_LoadModuleCompleted(object sender, LoadModuleCompletedEventArgs e)
        {
            moduleManager.LoadModuleCompleted -= moduleManager_LoadModuleCompleted;
            if (e.ModuleInfo.ModuleName == "MyModule")
            {
                //Initialization logic
            }
        }
(...)