Prism v2: требуется пояснение, почему модули должны регистрировать типы представлений в оболочке

Я читаю Prism v2 руководящие принципы, в которых говорится:

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

Я понимаю, что представления добавляются в загрузчик, например. в методе GetModuleCatalog ():

protected override IModuleCatalog GetModuleCatalog()
{
    ModuleCatalog catalog = new ModuleCatalog()
        .AddModule(typeof(HelloWorldModule.HelloWorldModule));
    return catalog;
}

Но что значит зарегистрировать тип представления? Почему модулям необходимо «регистрировать тип представления» в оболочке, если они уже «добавляют свои представления», как в приведенном выше коде?


person Edward Tanguay    schedule 05.03.2009    source источник


Ответы (4)


В вашем коде вы не добавляете представления в загрузчик, а модули в ModuleCatalog. Модуль в мире пользовательского интерфейса CAB / Prism / Composite может содержать представления, но во многих случаях он предоставляет некую дополнительную услугу, которую могут использовать другие модули. Например, предположим, что у меня есть оболочка, которая использует какой-то диспетчер стыковки для отображения представлений. Я хочу, чтобы модули использовали API IDockingWindowService для отображения / скрытия окна. Я хочу, чтобы реализация службы была легко взаимозаменяемой, поэтому я создаю модуль, который содержит службу под названием DockingWindowService и реализует IDockingWindowService. Я регистрирую этот модуль в ModuleCatalog.

Рабочий процесс составной платформы создаст эту службу, зарегистрирует ее в загрузчике, и любые модули, загруженные после этого, смогут использовать IDockingWindowService. Эта услуга - не представление, а логика; просто хотел указать на это различие. При этом модуль может содержать 0 или более представлений (или, для упрощения, UserControls). Единицей пользовательского интерфейса является представление. Модуль - это скорее концепция логики и / или объединения пользовательского интерфейса.

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

person Szymon Rozga    schedule 05.03.2009

Когда вы регистрируете тип в области, этот тип устанавливается всякий раз, когда область отображается.

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

person Graeme Bradbury    schedule 05.03.2009
comment
Я бы подумал, что в AddModule мы добавим модуль. Вместо этого мы добавляем тип модуля. В приложении, в котором я работал с модулями, у нас были такие методы, как AddModule, и мы действительно добавляли сами модули. Почему мы добавляем тип модуля вместо самого модуля? - person Edward Tanguay; 06.03.2009
comment
ModuleCatalog не содержит модуль, он содержит информацию о модуле. Я бы посоветовал понять DI / IoC перед тем, как продолжить работу с ModuleCatalog, поскольку вам нужно понять это, прежде чем вы поймете, почему вы не имеете дело с модулями, а только с типами модулей. - person Graeme Bradbury; 06.03.2009

В вашем примере вы добавляете модуль в модули приложения, которые я считаю загрузкой библиотеки с классом, реализующим интерфейс IModule (класс инициализатора модуля)

Каждый раз, когда вызывается метод Intialize этого класса инициализатора модуля, модуль регистрирует свои собственные сопоставления IoC и другие вещи, необходимые для работы модуля.

Теперь модуль может загрузить представление во время инициализации модуля (добавление пункта меню или элемента панели инструментов и т. Д.). Это будет охватывать часть вашего вопроса «добавление одного или нескольких представлений во время инициализации модуля».

Помимо отображения представлений во время инициализации, модуль обычно содержит больше представлений, которые не должны отображаться в момент загрузки модуля, а вместо этого обычно в ответ на какое-либо событие (событие UserLoogingIn может потребовать отображения vew входа в систему). Чтобы Prism показала это представление, все сопоставления между представлением и моделью представления должны быть определены уже в инициализаторе модуля.

Что-то вроде этого (на основе стиля кода RI)

this.container.Register (); this.container.Register ();

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

person Nikola Malovic    schedule 26.04.2009

В приведенном выше коде вы заполняете каталог модулей. Это часть того, как модульность работает в 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).

person Erik Mork    schedule 07.06.2009