2013-01-10 50 views
-1

我正在使用IModuleManager按需實現Unity PRISM模塊。假設有多個要求模塊功能的點。即使模塊可能已經加載過了,我是否有權在每個點調用moduleManager.LoadModule("MyModule")?它不會重新加載嗎?從多個點按需加載模塊

這是最佳實踐嗎?

感謝

+0

MEF?還是Unity?要麼? – Alan

+0

我正在使用Unity – Steve

+0

爲什麼這個問題被標記下來? – Steve

回答

-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 
      } 
     } 

(...) 
+4

雖然這可能會在技術上回答這個問題,但[這將是更可取的](http://meta.stackexchange.com/q/8259),您可以在此處總結鏈接的材料。否則,由於鏈接腐敗,答案有可能失去其用處。 –

+3

-1:鏈接不是答案。如果您同意Viktor的觀點,您應該接受他的回答,然後在回答評論時寫下您的快樂。 –

+0

@LightnessRacesinOrbit雖然Victor的答案是有益的,我很高興他寫了它,但我使用了鏈接的答案,因此我在這裏添加了它。 – Steve

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方法僅在您首次加載模塊時調用。

模塊加載意味着模塊組件從磁盤傳輸到內存中。所以......如果每次都重新加載,你真的不應該那樣做。只是回答你的問題「這是最佳做法嗎?」我不得不說...這絕對不是。我無法告訴你每次調用moduleManager.LoadModule("YourModule");時它是否被重新加載,但是恕我直言,你應該只加載一次模塊,僅僅因爲它們也這樣做。