Composite WPF applications with Prism

Preview:

DESCRIPTION

 

Citation preview

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

}

Recommended