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