【问题标题】:Load a Module on demand from multiple points从多个点按需加载模块
【发布时间】:2013-01-10 02:37:55
【问题描述】:

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

这是最佳实践吗?

谢谢

【问题讨论】:

  • 为什么这个问题被标记了?

标签: c# module prism


【解决方案1】:

当你看Prism Modularity Quickstart

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

    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"); 时都会重新加载它,但恕我直言,您应该只加载一次模块,因为它们也只加载一次。

【讨论】:

    【解决方案2】:

    同意 Viktor,this thread 中的响应建议不要调用 LoadModule,而是使用 IModuleCatalog 和 IModuleManager 检查 ModuleState。

    这是该帖子中的代码 sn-p:

    (...)
    
     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
                }
            }
    
    (...)
    

    【讨论】:

    • 虽然这可能在技术上回答问题,it would be preferable 供您在此处总结链接材料。否则,答案可能会因链接失效而失去其用处。
    • -1:链接不是答案。如果你同意 Viktor 的观点,你应该接受他的回答,然后在对该回答的评论中写下你的快乐。
    • @LightnessRacesinOrbit 虽然 Victor 的回答是有益的,我很高兴他写了它,但我使用了链接中的答案,因此我在这里添加了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 2022-10-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多