我正在使用IModuleManager按需实现Unity PRISM模块。假设有多个点需要模块的功能。即使模块可能先前已经加载过,我也可以在每个点上调用moduleManager.LoadModule("MyModule")
吗?这不是重装吗?
这是最佳做法吗?
由于
答案 0 :(得分: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
。
我试图摆脱它并发现以下内容:
多次致电moduleManager.LoadModule("YourModule");
时,不会抛出异常。
模块的Initialize
方法仅在您第一次加载模块时被调用。
模块加载意味着模块组件从磁盘传输到内存。所以...如果它每次重新加载你真的不应该这样做。只是回答你的问题“这是最好的做法吗?”我不得不说......这肯定不是。我无法告诉你每次拨打moduleManager.LoadModule("YourModule");
时是否重新加载,但恕我直言你应该只加载模块一次,因为他们也只做一次。
答案 1 :(得分:-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
}
}
(...)