从多个点按需加载模块

时间:2013-01-10 02:37:56

标签: c# module prism

我正在使用IModuleManager按需实现Unity PRISM模块。假设有多个点需要模块的功能。即使模块可能先前已经加载过,我也可以在每个点上调用moduleManager.LoadModule("MyModule")吗?这不是重装吗?

这是最佳做法吗?

由于

2 个答案:

答案 0 :(得分: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;
            }
        }
    }

请注意,如果this.RaiseRequestModuleLoad();不是ModuleInitializationStatus,则会阻止调用ModuleInitializationStatus.NotStarted

我试图摆脱它并发现以下内容:

  1. 多次致电moduleManager.LoadModule("YourModule");时,不会抛出异常。

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

  3. 模块加载意味着模块组件从磁盘传输到内存。所以...如果它每次重新加载你真的不应该这样做。只是回答你的问题“这是最好的做法吗?”我不得不说......这肯定不是。我无法告诉你每次拨打moduleManager.LoadModule("YourModule");时是否重新加载,但恕我直言你应该只加载模块一次,因为他们也只做一次。

答案 1 :(得分:-2)

同意Viktor,this thread中的响应建议不要调用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
            }
        }

(...)