Загрузка модуля с помощью ModuleManager в Prism - PullRequest
6 голосов
/ 19 декабря 2008

Этот вопрос также был размещен на сайте Prism на Codeplex .

Я немного растерялся при загрузке модулей по требованию, и я надеюсь, что вы, ребята, сможете меня просветить. Я использую v2 # 7 .

Вот что я хочу сделать:

1) У меня есть 2 региона - один для кнопок, которые создают экземпляры модулей (MenuRegion), другой для отображения модулей (MainRegion). В MenuRegion одновременно должен быть виден только один модуль.
2) Модули находятся в каталоге
3) Модуль MenuModule связан с MenuRegion и предназначен для создания кнопок с названиями модулей. При нажатии одной из кнопок соответствующий модуль должен быть загружен и отображен в MainRegion.
4) Поведение:
a) Нажата кнопка ModuleA, и отображается ModuleA. Пользователь вводит данные в ModuleA, и данные остаются в несохраненном состоянии.
б) Кнопка ModuleB нажата, и отображается ModuleB. Пользователь вводит данные в ModuleB, и данные остаются в несохраненном состоянии.
c) Кнопка ModuleA нажата, и отображается ModuleA с ранее введенной информацией.

Пожалуйста, исправьте меня, если я ошибаюсь в своих предположениях, и, пожалуйста, дайте мне другие предложения:

1) MainRegion должен быть ContentControl, поэтому одновременно виден только один модуль.
2) Я думаю, что мне нужно перечислить «GrouplessModules» моего каталога, чтобы получить ModuleInfo для модулей, доступных в каталоге
3) Для загрузки модуля, я думаю, мне нужно вызвать myModuleManager.LoadModule (moduleName)

Наконец, мои вопросы:

1) Должен ли я использовать moduleManager в качестве параметра в конструкторе моего MenuModuleView?
2) Как мне получить доступ к каталогу из MenuModuleView, чтобы перечислить доступные модули?
3) Из MenuModuleView, при перечислении модулей, я создаю кнопки, назначая ModuleInfo свойству Tag кнопки. Таким образом, у меня есть только одно событие щелчка для загрузки модуля. Это правильно? Это пахнет немного по-деловому ...

Большое спасибо за вашу помощь !!!

1 Ответ

7 голосов
/ 19 декабря 2008

1) Должен ли я иметь ModuleManager как параметр в моем MenuModuleView конструктор?

Технически, вы могли бы. Тем не менее, на практике вы все равно захотите определить конструктор по умолчанию для своего представления. Иначе ваш взгляд не будет работать у дизайнеров. Поэтому я рекомендую использовать свойства для передачи зависимостей компонентам пользовательского интерфейса.

2) Как мне сделать каталог доступным изнутри MenuModuleView, по порядку перечислить доступные модули?

Вы зависите от интерфейса IModuleEnumerator Prism, а внедрение зависимостей позаботится о предоставлении перечислителя модулей вашему представлению. Предполагая, что вы используете Prism с контейнером Unity, это будет выглядеть примерно так:

[Dependency]
public IModuleEnumerator ModuleEnumerator 
{
    get; set;
}

3) Из MenuModuleView, как я перечисляю через модули я создаю кнопки, присваивая ModuleInfo свойство тега кнопки. Таким образом, я иметь только одно событие щелчка, чтобы загрузить модуль. Это правильно? Пахнет немного обходной для меня ..

Я бы предложил, чтобы каждая кнопка вызывала одну и ту же команду WPF и вместо этого присваивала ModuleInfo свойству Button CommandParameter. Опять же, у Prism есть инфраструктура, которая поможет вам сделать это чисто в сложном сценарии. См. DelegateCommand класс.

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

...