Top Banner
Composite WPF with Prism
22

Composite WPF applications with Prism

Dec 14, 2014

Download

Technology

 
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: Composite WPF applications with Prism

Composite WPF with Prism

Page 2: Composite WPF applications with Prism

План

Зачем нужны модульные приложения?

Модульность с помощью Prism

Page 3: Composite WPF applications with Prism

Зачем нужна модульность?

Слабое связывание, driving app to DIP

Система плагинов

Уменьшение влияния одной части системы на другую

Параллельная разработка

Performance / memory usage

Page 4: Composite WPF applications with Prism

Typical composite application

Page 5: Composite WPF applications with Prism

Starting the composite application development

Page 6: Composite WPF applications with Prism

Shell

Page 7: Composite WPF applications with Prism

Shell

Ближайший аналог - master page в ASP.NET

UI элемент верхнего уровня (Main window)

Определяет верхний уровень структуры UI и placeholder’ы для контента (регионы)

Не знает и не имеет прямых зависимостей от модулей

Создаётся и показывается bootstrapper’ом

Находится в исполняемой .exe сборке

Page 8: Composite WPF applications with Prism

Bootstrapper

Page 9: Composite WPF applications with Prism

Bootstrapper

Ответственный за инициализацию

Инициализирует компоненты Prism

Находится в исполняемой .exe сборке

Создаётся и запускается в OnStartUp App.xaml.cs

Page 10: Composite WPF applications with Prism

Bootstrapping process

Создание и конфигурация каталога модулей

Создание и конфигурация IoC контейнера

Конфигурация регионов

Создание и инициализация Shell

Инициализация модулей

Page 11: Composite WPF applications with Prism

Region

Page 12: Composite WPF applications with Prism

Region

Placeholder для загрузки других элементов UI в Shell

Доступны через IRegionManager

View injection

View discovery

Prism navigation API

Page 13: Composite WPF applications with Prism

View injection

<ItemsControl RegionManager.RegionName=’’ToolbarRegion’’ />

<ItemsControl RegionManager.RegionName=’’ContentRegion’’ />

ContentView view = ...IRegion contentRegion =

regionManager.Regions[‘‘ContentRegion’’];contentRegion.Add(view);

Page 14: Composite WPF applications with Prism

View discovery

<ItemsControl RegionManager.RegionName=’’ToolbarRegion’’ />

<ItemsControl RegionManager.RegionName=’’ContentRegion’’ />

regionManager.RegisterViewWithRegion(‘‘ContentRegion’’, typeof(ContentView));

Page 15: Composite WPF applications with Prism

Module

Набор логически объединенных UI элементов, сервисов, данных

Набор общих компонент

Могут разрабатываться и тестироваться независимо друг от друга

Могут находится в разных сборках

Зависят друг от друга через абстракции

Page 16: Composite WPF applications with Prism

Module catalog

Объявление списка всех доступных модулей

Порядок загрузки модулей

Зависимости между модулями

Может задаваться в коде, xaml, config файле или загружаться из директории

Page 17: Composite WPF applications with Prism

Module

Регистрация маппингов в IoC container

Начальная конфигурация

interface IModule{

void Initialize();}

Page 18: Composite WPF applications with Prism

Общение между компонентами

Общие сервисы

Event aggregator / event bus

Page 19: Composite WPF applications with Prism

Event aggregator

Page 20: Composite WPF applications with Prism

Event aggregator

Используется для коммуникации между слабосвязанными компонентами

Pub/sub модель

События строго типизированны

Page 21: Composite WPF applications with Prism

Event

Чаще объявляется в общей сборке для возможности кросс-модульного использования

Наследуется от CompositePresentationEvent<T>

T - тип полезной нагрузки, передаваемой подписчикам

public class SymbolSelectedEvent : CompositePresentationEvent<string> {}

Page 22: Composite WPF applications with Prism

IEventAggregator

Регистрируется в IoC контейнере на этапе bootstrapping’а

DI через конструктор

class SymbolsViewModel(IEventAggregator aggregator){

aggregator.GetEvent<SymbolSelectedEvent>().Subscribe(SymbolChanged);

}