Загрузка модуля по требованию из нескольких точек
Я реализую модуль PRIMM Unity по требованию, используя IModuleManager. Предположим, есть несколько точек, где требуется функциональность модуля. Правильно ли я позвоню moduleManager.LoadModule("MyModule")
в каждой из этих точек, даже если модуль уже был загружен ранее? Это не собирается перезагрузить это?
И это лучшая практика?
Спасибо
2 ответа
Согласившись с Виктором, ответ в этой теме предлагает не вызывать LoadModule, а проверять ModuleState с помощью IModuleCatalog и IModuleManager.
Вот фрагмент кода из этого поста:
(...)
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
}
}
(...)
Когда вы смотрите на Призма Модульность Быстрый старт
Вы найдете этот метод, который отвечает за загрузку модуля
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");
но ИМХО Вы должны загрузить модуль только один раз, просто потому что они делают это один раз.