我正在使用IModuleManager按需實現Unity PRISM模塊。假設有多個要求模塊功能的點。即使模塊可能已經加載過了,我是否有權在每個點調用moduleManager.LoadModule("MyModule")
?它不會重新加載嗎?從多個點按需加載模塊
這是最佳實踐嗎?
感謝
我正在使用IModuleManager按需實現Unity PRISM模塊。假設有多個要求模塊功能的點。即使模塊可能已經加載過了,我是否有權在每個點調用moduleManager.LoadModule("MyModule")
?它不會重新加載嗎?從多個點按需加載模塊
這是最佳實踐嗎?
感謝
與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
}
}
(...)
雖然這可能會在技術上回答這個問題,但[這將是更可取的](http://meta.stackexchange.com/q/8259),您可以在此處總結鏈接的材料。否則,由於鏈接腐敗,答案有可能失去其用處。 –
-1:鏈接不是答案。如果您同意Viktor的觀點,您應該接受他的回答,然後在回答評論時寫下您的快樂。 –
@LightnessRacesinOrbit雖然Victor的答案是有益的,我很高興他寫了它,但我使用了鏈接的答案,因此我在這裏添加了它。 – Steve
當你看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
。
我試圖擺脫的是,發現以下幾點:
沒有例外,當你調用moduleManager.LoadModule("YourModule");
多次拋出。
模塊的Initialize
方法僅在您首次加載模塊時調用。
模塊加載意味着模塊組件從磁盤傳輸到內存中。所以......如果每次都重新加載,你真的不應該那樣做。只是回答你的問題「這是最佳做法嗎?」我不得不說...這絕對不是。我無法告訴你每次調用moduleManager.LoadModule("YourModule");
時它是否被重新加載,但是恕我直言,你應該只加載一次模塊,僅僅因爲它們也這樣做。
MEF?還是Unity?要麼? – Alan
我正在使用Unity – Steve
爲什麼這個問題被標記下來? – Steve