composite wpf applications with prism
DESCRIPTION
TRANSCRIPT
Composite WPF with Prism
План
Зачем нужны модульные приложения?
Модульность с помощью Prism
Зачем нужна модульность?
Слабое связывание, driving app to DIP
Система плагинов
Уменьшение влияния одной части системы на другую
Параллельная разработка
Performance / memory usage
Typical composite application
Starting the composite application development
Shell
Shell
Ближайший аналог - master page в ASP.NET
UI элемент верхнего уровня (Main window)
Определяет верхний уровень структуры UI и placeholder’ы для контента (регионы)
Не знает и не имеет прямых зависимостей от модулей
Создаётся и показывается bootstrapper’ом
Находится в исполняемой .exe сборке
Bootstrapper
Bootstrapper
Ответственный за инициализацию
Инициализирует компоненты Prism
Находится в исполняемой .exe сборке
Создаётся и запускается в OnStartUp App.xaml.cs
Bootstrapping process
Создание и конфигурация каталога модулей
Создание и конфигурация IoC контейнера
Конфигурация регионов
Создание и инициализация Shell
Инициализация модулей
Region
Region
Placeholder для загрузки других элементов UI в Shell
Доступны через IRegionManager
View injection
View discovery
Prism navigation API
View injection
<ItemsControl RegionManager.RegionName=’’ToolbarRegion’’ />
<ItemsControl RegionManager.RegionName=’’ContentRegion’’ />
ContentView view = ...IRegion contentRegion =
regionManager.Regions[‘‘ContentRegion’’];contentRegion.Add(view);
View discovery
<ItemsControl RegionManager.RegionName=’’ToolbarRegion’’ />
<ItemsControl RegionManager.RegionName=’’ContentRegion’’ />
regionManager.RegisterViewWithRegion(‘‘ContentRegion’’, typeof(ContentView));
Module
Набор логически объединенных UI элементов, сервисов, данных
Набор общих компонент
Могут разрабатываться и тестироваться независимо друг от друга
Могут находится в разных сборках
Зависят друг от друга через абстракции
Module catalog
Объявление списка всех доступных модулей
Порядок загрузки модулей
Зависимости между модулями
Может задаваться в коде, xaml, config файле или загружаться из директории
Module
Регистрация маппингов в IoC container
Начальная конфигурация
interface IModule{
void Initialize();}
Общение между компонентами
Общие сервисы
Event aggregator / event bus
Event aggregator
Event aggregator
Используется для коммуникации между слабосвязанными компонентами
Pub/sub модель
События строго типизированны
Event
Чаще объявляется в общей сборке для возможности кросс-модульного использования
Наследуется от CompositePresentationEvent<T>
T - тип полезной нагрузки, передаваемой подписчикам
public class SymbolSelectedEvent : CompositePresentationEvent<string> {}
IEventAggregator
Регистрируется в IoC контейнере на этапе bootstrapping’а
DI через конструктор
class SymbolsViewModel(IEventAggregator aggregator){
aggregator.GetEvent<SymbolSelectedEvent>().Subscribe(SymbolChanged);
}