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’’ />




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




                             <ItemsControl
              RegionManager.RegionName=’’ContentRegion’’ />
View discovery
               <ItemsControl
RegionManager.RegionName=’’ToolbarRegion’’ />




                                                    regionManager.RegisterViewWithRegion(‘‘Co
                                                        ntentRegion’’, typeof(ContentView));




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

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

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

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

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

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

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

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

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

Может задаваться в коде, xaml, config
файле или загружаться из директории
Module
        interface IModule
        {
           void Initialize();
        }

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

Начальная конфигурация
Общение между
   компонентами


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

Event aggregator / event bus
Event aggregator
Event aggregator


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

Pub/sub модель

События строго типизированны
Event
  public class SymbolSelectedEvent :
  CompositePresentationEvent<string>
  {
  }

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

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

T - тип полезной нагрузки, передаваемой
подписчикам
IEventAggregator
class SymbolsViewModel(IEventAggregator
aggregator)
{
    aggregator.GetEvent<SymbolSelectedEvent>().
    Subscribe(SymbolChanged);
}
Регистрируется в IoC контейнере на
этапе bootstrapping’а

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

Composite WPF applications with Prism

  • 1.
  • 2.
    План Зачем нужны модульныеприложения? Модульность с помощью Prism
  • 3.
    Зачем нужна модульность? Слабое связывание, driving app to DIP Система плагинов Уменьшение влияния одной части системы на другую Параллельная разработка Performance / memory usage
  • 4.
    Typical composite application
  • 5.
  • 6.
  • 7.
    Shell Ближайший аналог -master page в ASP.NET UI элемент верхнего уровня (Main window) Определяет верхний уровень структуры UI и placeholder’ы для контента (регионы) Не знает и не имеет прямых зависимостей от модулей Создаётся и показывается bootstrapper’ом Находится в исполняемой .exe сборке
  • 8.
  • 9.
    Bootstrapper Ответственный за инициализацию Инициализируеткомпоненты Prism Находится в исполняемой .exe сборке Создаётся и запускается в OnStartUp App.xaml.cs
  • 10.
    Bootstrapping process Создание иконфигурация каталога модулей Создание и конфигурация IoC контейнера Конфигурация регионов Создание и инициализация Shell Инициализация модулей
  • 11.
  • 12.
    Region Placeholder для загрузкидругих элементов UI в Shell Доступны через IRegionManager View injection View discovery Prism navigation API
  • 13.
    View injection <ItemsControl RegionManager.RegionName=’’ToolbarRegion’’ /> ContentView view = ... IRegion contentRegion = regionManager.Regions[‘‘ContentRegion’’]; contentRegion.Add(view); <ItemsControl RegionManager.RegionName=’’ContentRegion’’ />
  • 14.
    View discovery <ItemsControl RegionManager.RegionName=’’ToolbarRegion’’ /> regionManager.RegisterViewWithRegion(‘‘Co ntentRegion’’, typeof(ContentView)); <ItemsControl RegionManager.RegionName=’’ContentRegion’’ />
  • 15.
    Module Набор логически объединенныхUI элементов, сервисов, данных Набор общих компонент Могут разрабатываться и тестироваться независимо друг от друга Могут находится в разных сборках Зависят друг от друга через абстракции
  • 16.
    Module catalog Объявление спискавсех доступных модулей Порядок загрузки модулей Зависимости между модулями Может задаваться в коде, xaml, config файле или загружаться из директории
  • 17.
    Module interface IModule { void Initialize(); } Регистрация маппингов в IoC container Начальная конфигурация
  • 18.
    Общение между компонентами Общие сервисы Event aggregator / event bus
  • 19.
  • 20.
    Event aggregator Используется длякоммуникации между слабосвязанными компонентами Pub/sub модель События строго типизированны
  • 21.
    Event publicclass SymbolSelectedEvent : CompositePresentationEvent<string> { } Чаще объявляется в общей сборке для возможности кросс-модульного использования Наследуется от CompositePresentationEvent<T> T - тип полезной нагрузки, передаваемой подписчикам
  • 22.
    IEventAggregator class SymbolsViewModel(IEventAggregator aggregator) { aggregator.GetEvent<SymbolSelectedEvent>(). Subscribe(SymbolChanged); } Регистрируется в IoC контейнере на этапе bootstrapping’а DI через конструктор