Загрузка модуля по требованию из нескольких точек

Я реализую модуль 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,

Я попытался избавиться от этого и обнаружил следующее:

  1. При звонке не возникает исключение moduleManager.LoadModule("YourModule"); многократно.

  2. модуля Initialize Метод вызывается только при первой загрузке модуля.

Загрузка модуля означает, что сборка модуля переносится с диска в память. Так что... Если он будет перезагружаться каждый раз, тебе действительно не следует этого делать. Просто чтобы ответить на ваш вопрос "Это лучшая практика?" Я должен сказать... Это, безусловно, нет. Я не могу сказать вам, перезагружается ли он каждый раз, когда вы звоните moduleManager.LoadModule("YourModule"); но ИМХО Вы должны загрузить модуль только один раз, просто потому что они делают это один раз.

Другие вопросы по тегам