Призма v2:ищу разъяснения, почему модули должны «регистрировать типы представлений в оболочке»

StackOverflow https://stackoverflow.com/questions/614069

  •  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).

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top