Upload
others
View
21
Download
0
Embed Size (px)
Citation preview
Восьмая независимая научно-практическая конференция «Разработка ПО 2012»1 - 2 ноября, Москва
Ксения Мухортова
CQRS: Архитектура, которая делает бизнес-приложения лучше
Intel
Проблемы разработчика бизнес-приложений
Предметная область - чужой мир Частое изменение требований Не- или слабоструктурированные данные
Технические проблемы
Изменения требований затрагивают всё приложение
Эволюция технологий Поддержка нескольких типов UI Несоответствие моделей хранения – логики –
отображения AJAX: Необходимость передавать и view и
данные
Опять проблемы?
Меняешь доменную модель – переделай маппинги
Масштабируемость и синхронизация Бизнес-намерения утеряны при сохранении
данных
ЖУТКО СЛОЖНО!!!
CQS -> CQRS
Command: команда выполняет действие, не возвращает результат
Query: запрос возвращает результат, не выполняет действий
Подсистема запросов
Клиент viewПрезентационная логика
БД для чтения
SQL
«Тупой» слой трансформации
DTOs
Подсистема команд
Репозиторий
Клиент view
Команды
Обработчик команд
Домен Результаты запроса
«Тупой» слой трансформации«Тупой» слой
трансформации
Храни-лище
События События
Презентационная логика
Event sourcing
Команда Событие
Подсистема синхронизации
Домен
Обработчик событий/
Денормализатор
«Тупой» слой трансформации
Клиент viewПрезентационная логика
БД для чтения
SQL
«Тупой» слой трансформации
DTOs
Репозиторий
Команды
Обработчик команд
Домен Результаты запроса
Храни-лище
События События
Обработчик событий/
Денормализатор
Всё вместе
Преимущества event sourcing
Хранятся только события – объективные факты Независимость структуры доменных объектов от
модели хранения Возможность ретроспективной функциональности Тестирование поведения, а не состояния
Тестируем поведение (BDD)
Каждый сценарий описывается тремя категориями: •Given:
инстанциируем объект, устанавливаем состояние проигрывая цепочку событий
•When: вызываем команду•Then:проверяем сгенерированные события
BDD заставляет мыслить в терминах функциональности13
Универсальное решение?
Важно запомнить про CQRS
15
““Правильный” DDD – залог успехаAggregates (eventual vs transactional consistency)Bounded contextsМоделирование поведения, а не реального мира
Отличия между командами и событиямиORM в write части – ЗЛОUnit-тестируйте поведение, а не состояние
Источники информации
Greg Young, Udi Dahan, Eric Evans, Rinat AbdullinMicrosoft CQRS journey: http://msdn.microsoft.com/en-us/library/jj554200.aspx
16
Пример
Предметная область
18
Task
Stage 1 Stage 2 Stage N
Предметная область
19
Stage
End condition
Stage 1
Stage 2
Отправка команды добавления задачи на WCF сервис
20
Интерфейс WCF сервиса
21
Команда добавления задачи
22
Обработчик команды добавления задачи
23
Доменный объект “задача”
24
Обработчик события добавления задачи
25
26
Id Task name Task Status Stage name Stage status
1 First task NotStarted First stage NotStarted
1 First task NotStarted Second stage NotStarted
Id Name Status
1 First task NotStarted
2 Second task InProgressId Name
1 First task
3 Third task
Получение списка задач
27
Тестирование
28
29
30