根据需要从多个点加载模块
本文关键字:加载 模块 | 更新日期: 2023-09-27 17:51:19
我正在使用IModuleManager按需实现Unity PRISM模块。假设有多个点需要模块的功能。我是否可以在这些点上调用moduleManager.LoadModule("MyModule")
,即使模块之前可能已经加载?它不会重新加载,对吧?
这是最佳实践吗?
谢谢
当你看Prism模块化快速入门
你会发现这个方法负责加载Module
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");
时它是否重新加载,但IMHO你应该只加载模块一次,因为它们也这样做一次。
同意Viktor的意见,这个线程中的响应建议不要调用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
}
}
(...)