2009-03-05 5 views
0

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

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

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

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

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

ответ

5

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

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

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

2

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

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

+0

Я бы подумал в «AddModule», что мы «добавим модуль». Вместо этого мы «добавляем тип модуля». В приложении, в котором я работал с модулями, у нас были такие методы, как AddModule, и мы действительно действительно добавляли сами модули. Почему мы добавляем «тип модуля» вместо самого модуля? –

+0

ModuleCatalog не содержит модуль, в котором содержится информация о модуле. Я предлагаю понять DI/IoC перед тем, как продолжить работу с ModuleCatalog, так как вам нужно понять, что прежде чем вы поймете, почему вы не имеете дело с модулями и только с типами модулей. –

0

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

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

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

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

Нечто подобное (на основе стиля RI кода)

this.container.Register(); этот.контейнер.Register();

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

0

В приведенном выше коде вы заполняете каталог модулей. Это часть того, как модульность работает в Призме. У меня есть screencast, объясняющий это here. По сути, вы говорите Призме, чтобы загрузить файл .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)); 

Вы можете регистрировать любое количество видов здесь в Инициализация. И в любом Инициализация для любого модуля (опять же, обычно .xap или .dll).

 Смежные вопросы

  • Нет связанных вопросов^_^