Я создал проект, используя структуру PRISM. У меня есть несколько модулей, которые я могу зарегистрировать и отобразить в оболочке, и это отлично работает. Что мне нужно сделать, так это динамически отображать и скрывать модули, когда конкретное событие получено от агрегатора событий.

Я запускаю событие DisplayModule, которое должно быть получено, и скрываю существующий модуль, и показываю новый, но мой вопрос: где я должен получить это событие и отобразить модуль? оболочка? если да, то как мне это сделать, поскольку оболочка является верхним уровнем и, похоже, не наследует необходимые методы Unity.

Я также подумал, что мог бы иметь отдельный модуль, который прослушивал бы событие DisplayModule и использовал диспетчер регионов, чтобы скрыть предыдущий модуль и показать новый. Это должно было бы ссылаться на все другие модули, чтобы иметь возможность разрешить их тип, хотя это плохая практика?

Надеюсь, это имеет смысл.

Спасибо за уделенное время

1
suiva 23 Сен 2009 в 14:32

2 ответа

Однако вы не можете выгрузить весь модуль. Вы можете динамически загружать один, но не выгружать его. Дополнительные сведения см. в разделе Загрузка модулей по запросу в следующей статье: http://msdn.microsoft.com/en-us/library/dd458911.aspx

Предположение: я начну с предположения, что когда вы говорите, что хотите выгрузить модуль, вы просто хотите, чтобы все его представления были удалены из вашего приложения.

Прежде всего, давайте поговорим о том, как работают ваши модули и как они отображают свое содержимое в вашей оболочке.

В вашей оболочке будет один или несколько регионов, в которых ваши модули смогут зарегистрировать представления при их инициализации.

public MyFirstModule : IModule
{
     IRegionManager _mgr;
     public MyFirstModule(IRegionManager mgr)
     {
          _mgr = mgr;
     }

     public void Initialize()
     {
          _mgr.RegisterViewWithRegion("MainRegion", typeof(MyView));
     }

}

Что вы можете сделать, так это изменить инициализацию вашего модуля, чтобы отслеживать представления, которые были зарегистрированы в этом модуле, и выгружать их, когда это необходимо.

public MyFirstModule : IModule
{
     IRegionManager _mgr;
     IEventAggregator _agg;
     IUnityContainer _container;
     public MyFirstModule(IRegionManager mgr, 
                          IEventAggregator agg, 
                          IUnityContainer container)
     {
          _mgr = mgr;
          _agg = agg;
          _container = container;
     }

     List<object> Views = new List<object>();
     public void Initialize()
     {
          _mgr.RegisterViewWithRegion("MainRegion", () =
          {
               MyView view = _container.Resolve<MyView>();

               //Track this view so I can remove it if needed
               Views.Add(view);
               return view;
          });

          _agg.GetEvent<UnloadModuleRequest>.Subscribe(RemoveViews,                
                                                       ThreadOptions.UIThread);
     }

     private void RemoveViews(string moduleToUnload)
     {
          //If this is true, that means the Shell is asking
          //me to unload, so I will remove any views I've
          //registered from any regions they were registered to
          if(moduleToUnload == "MyFirstModule")
          {
               foreach(object view in Views)
               {
                    _mgr.Regions["MainRegion"].Remove(view);
               }
          }

     }

}

Таким образом, ваша оболочка может опубликовать событие с именем UnloadModuleRequest (типа CompositePresentationEvent<string>) и заставить любой прослушивающий модуль выгрузить все зарегистрированные представления.

Я надеюсь, что это близко к тому, что вы хотите.

4
Anderson Imes 25 Сен 2009 в 00:48

Следующие темы посвящены подобным ситуациям и объясняют возможные способы достижения ваших целей:

Пожалуйста, дайте мне знать, если это поможет.

Дамиан Шенкельман http://blogs.southworks.net/dschenkelman

2
Anderson Imes 25 Сен 2009 в 00:43
На самом деле ничего не говорится о выгрузке модуля.
 – 
Anderson Imes
25 Сен 2009 в 00:44
Тем не менее, первая тема довольно хороша. Некоторые из упомянутых там вещей, скорее всего, появятся при «перезагрузке» модуля. Может быть, это обсуждение отговорит suiva от того, что он / она пытается сделать, хотя ... похоже, что у ОП есть небольшое непонимание того, что такое модуль, и эта ветка сильно его утюжит. Спасибо за публикацию.
 – 
Anderson Imes
25 Сен 2009 в 01:02