composite wpf applications with prism

22
Composite WPF with Prism

Upload: sviataslau-seviaryn

Post on 14-Dec-2014

387 views

Category:

Technology


1 download

DESCRIPTION

 

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);

}