【发布时间】:2013-01-10 02:37:55
【问题描述】:
我正在使用 IModuleManager 按需实现 Unity PRISM 模块。假设有多个需要模块功能的点。即使模块之前可能已经加载,我是否有权在这些点中的每一个点调用moduleManager.LoadModule("MyModule")?它不会重新加载是吗?
这是最佳实践吗?
谢谢
【问题讨论】:
-
为什么这个问题被标记了?
我正在使用 IModuleManager 按需实现 Unity PRISM 模块。假设有多个需要模块功能的点。即使模块之前可能已经加载,我是否有权在这些点中的每一个点调用moduleManager.LoadModule("MyModule")?它不会重新加载是吗?
这是最佳实践吗?
谢谢
【问题讨论】:
当你看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(); 的条件。
我试图摆脱它并发现以下内容:
多次调用moduleManager.LoadModule("YourModule");不会抛出异常。
模块的Initialize 方法仅在您第一次加载模块时被调用。
模块加载意味着模块组件从磁盘传输到内存。所以...如果每次都重新加载你真的不应该那样做。只是为了回答您的问题“这是最佳做法吗?”我不得不说......这肯定不是。我无法告诉您是否每次调用moduleManager.LoadModule("YourModule"); 时都会重新加载它,但恕我直言,您应该只加载一次模块,因为它们也只加载一次。
【讨论】:
同意 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
}
}
(...)
【讨论】: