Призма v2:ищу разъяснения, почему модули должны «регистрировать типы представлений в оболочке»
-
03-07-2019 - |
Вопрос
Я читаю Рекомендации по Prism v2 в котором они заявляют:
Во время инициализации модули используют RegionManager для размещения регионов в оболочке и добавить одно или несколько просмотров в эти регионы или Зарегистрировать один или несколько типов просмотров быть созданным в этих регионах
Я понимаю, что представления добавляются в загрузчик, например.в методе GetModuleCatalog():
protected override IModuleCatalog GetModuleCatalog()
{
ModuleCatalog catalog = new ModuleCatalog()
.AddModule(typeof(HelloWorldModule.HelloWorldModule));
return catalog;
}
Но что значит зарегистрировать тип представления?Почему модулям необходимо «регистрировать тип представления» в оболочке, если они уже «добавляют свои представления», как в приведенном выше коде?
Решение
В своем коде вы не добавляете Views в загрузчик, а Modules в ModuleCatalog. Модуль в мире пользовательского интерфейса CAB / Prism / Composite может содержать представления, но во многих случаях он предоставляет своего рода дополнительную услугу, которую могут использовать другие модули. Например, допустим, у меня есть оболочка, которая использует менеджер стыковки для отображения представлений. Я хочу, чтобы модули использовали API IDockingWindowService, чтобы показать / скрыть окно. Я хочу, чтобы реализация службы была легко взаимозаменяемой, поэтому я создаю Модуль, который содержит службу с именем DockingWindowService и реализует IDockingWindowService. Я регистрирую этот модуль в ModuleCatalog. Р>
Рабочий процесс составного фреймворка создаст этот сервис, зарегистрирует его с помощью загрузчика, и любые модули, загруженные после этого, смогут использовать IDockingWindowService. Этот сервис - не представление, а логика; просто хотел указать на это различие. При этом модуль может содержать 0 или более представлений (или, как упрощение, пользовательские элементы управления). Единицей пользовательского интерфейса является вид. Модуль - это скорее логика и / или концепция связывания пользовательского интерфейса.
Возвращаясь к вашему конкретному вопросу: документация говорит о том, что если вы используете Регионы для отображения ваших Представлений, вы можете зарегистрировать типы Представлений в Регионе. Всякий раз, когда отображается регион, он автоматически создает представление с использованием контейнера Unity.
Другие советы
Когда вы регистрируете тип в Region, этот тип устанавливается каждый раз, когда отображается регион.
Если вы находите регион и затем добавляете в него представления, вам не нужно регистрировать тип в этом представлении, поскольку вы выполняете работу, а не позволяете менеджеру региона делать это.
В вашем примере вы добавляете модуль к модулям приложения, которые я рассматриваю как загрузку библиотеки с классом, реализующим интерфейс IModule (класс инициализатора модуля).
Каждый раз, когда вызывается метод Intialize этого класса инициализатора модуля, модуль регистрирует свои собственные сопоставления IoC и другие вещи, необходимые для работы модуля.
Теперь модуль может загрузить представление во время инициализации модуля (добавление пункта меню или элемента панели инструментов и т. д.).Это будет охватывать часть вашего вопроса «добавление одного или нескольких представлений во время инициализации модуля».
Помимо отображения представлений во время инициализации, модуль обычно содержит больше представлений, которые не должны отображаться в момент загрузки модуля, а обычно в ответ на какое-либо событие (событие UserLoogingIn может потребовать отображения представления входа в систему).Чтобы Prism показывала это представление, все сопоставления между представлением и моделью представления должны быть определены уже в инициализаторе модуля.
Что-то вроде этого (на основе стиля кода RI)
этот.контейнер.Регистр();этот.контейнер.Регистр();
Итак, инициализатор модуля будет регистрировать просмотры путем определения сопоставлений, необходимых для единства для разрешения представления во время операции загрузки представления менеджером региона.
В приведенном выше коде вы заполняете каталог модулей. Это часть того, как модульность работает в Prism. У меня есть скринкаст, объясняющий это здесь . По сути, вы говорите Prism загрузить файл .dll или .xap. Эти «модули» может содержать 2 вещи: службы (подумайте о реализации интерфейсов) и представления.
Когда загружается модуль (обычно это файл .dll или .xap), вызывается метод Initialize, где вы можете зарегистрировать службы и регионы:
public class ModuleA : IModule
{
IRegionManager _regionManager;
IUnityContainer _container;
public ModuleA(IRegionManager regionManager, IUnityContainer container)
{
_regionManager = regionManager;
_container = container;
}
#region IModule Members
public void Initialize()
{
_container.RegisterType<ICompanyService, CompanyService>();
_regionManager.RegisterViewWithRegion("MainRegion", typeof(ModuleAView));
}
#endregion
}
Обратите внимание на регистрацию просмотра:
_regionManager.RegisterViewWithRegion("MainRegion", typeof(ModuleAView));
Вы можете зарегистрировать любое количество просмотров здесь в Initialize. И в любой инициализации для любого модуля (опять же, обычно .xap или .dll).