Предметно-ориентированное проектирование: паттерны, принципы и методы
Писать программы легко — во всяком случае с нуля. Но изменить однажды написанный программный код, который создали другие разработчики или вы сами каких-то шесть лет тому назад, — гораздо сложнее. Программа работает, но вы не знаете точно, как именно. Даже обращение к экспертам в предметной области ничего не дает, поскольку в коде не сохранилось никаких следов привычного для них языка.
Предметно-ориентированное проектирование (Domain-Driven Design, DDD) — это процесс тесной увязки программного кода с реалиями предметной области.
Благодаря ему добавление в программный продукт новых возможностей по мере его развития становится таким же простым, как и при создании программы с нуля.
Эта книга в полной мере соответствует философии DDD и позволяет разработчикам перейти от философских рассуждений к решению практических задач. Она делится на четыре части: часть I посвящена философии, принципам и приемам предметно-ориентированного проектирования; в части II подробно обсуждаются стратегические шаблоны интеграции ограниченных контекстов; часть III охватывает тактические шаблоны создания эффективных моделей предметной области; часть IV в деталях описывает шаблоны проектирования, которые позволяют извлекать пользу из модели предметной области и создавать эффективные приложения.
Об авторе................................................................................................................20
О соавторе...................................................................................................................................................20
О научном редакторе..............................................................................................................................20
Благодарности........................................................................................................21
Введение................................................................................................................22
Обзор книги и технологии....................................................................................................................22
Пространство задачи........................................................................................................................23
Пространство решений...................................................................................................................23
Структура этой книги.............................................................................................................................24
Часть I. Принципы и приемы предметно-ориентированного проектирования..........25
Часть II. Стратегические шаблоны: взаимодействие ограниченных контекстов.......27
Часть III. Тактические шаблоны: создание эффективных моделей предметной области..........27
Часть IV. Шаблоны проектирования эффективных приложений...................................29
Кому адресована эта книга...................................................................................................................30
Исходный код............................................................................................................................................30
Опечатки.....................................................................................................................................................30
Форумы P2P.WROX.COM...................................................................................................................31
Резюме.........................................................................................................................................................32
От издательства........................................................................................................................................32
Часть I. Принципы и приемы предметно-ориентированного проектирования.............................33
Глава 1. Что такое предметно-ориентированное проектирование?...............................34
Проблемы разработки программного обеспечения для сложных
предметных областей..............................................................................................................................35
Код, созданный без использования общего языка................................................................36
Недостаточная организация..........................................................................................................36
Шаблон «Большой ком грязи» тормозит развитие продукта...........................................37
Недостаточное внимание к предметной области...................................................................37
Как шаблоны предметно-ориентированного проектирования помогают обуздать сложность..38
Стратегические шаблоны DDD...................................................................................................38
Тактические шаблоны DDD..........................................................................................................41
Пространство задачи и пространство решения......................................................................42
Приемы и принципы предметно-ориентированного проектирования.................................42
Концентрация на смысловом ядре..............................................................................................43
Изучение через сотрудничество..................................................................................................43
Создание моделей посредством исследований и экспериментов....................................44
Коммуникация...................................................................................................................................44
Понимание границ применимости модели..............................................................................44
Постоянное развитие модели........................................................................................................45
Типичные заблуждения, связанные с предметно-ориентированным
проектированием......................................................................................................................................45
Суть DDD — в тактических шаблонах......................................................................................45
DDD — это фреймворк....................................................................................................................46
DDD — это панацея..........................................................................................................................46
Ключевые идеи..........................................................................................................................................47
Глава 2. Дистилляция предметной области задачи......................................................48
Переработка знаний и сотрудничество............................................................................................48
Достижение единого понимания через общий язык.............................................................49
Важность знаний в предметной области...................................................................................50
Роль бизнес-аналитиков.................................................................................................................51
Непрекращающийся процесс........................................................................................................51
Углубление знаний с помощью экспертов в предметной области..........................................52
Эксперты в предметной области и заинтересованные лица..............................................52
Углубление знаний специалистов со стороны бизнеса........................................................52
Тесное взаимодействие с экспертами в предметной области............................................52
Шаблоны эффективной переработки знаний................................................................................54
Сосредоточьтесь на самых интересных темах.........................................................................54
Начните с вариантов использования.........................................................................................54
Задавайте продуктивные вопросы..............................................................................................54
Схемы и диаграммы.........................................................................................................................55
Используйте CRC-карточки.........................................................................................................56
Не спешите именовать понятия в модели................................................................................56
Разработка через реализацию поведения.................................................................................57
Быстрое прототипирование...........................................................................................................58
Изучайте «бумажные» процессы.................................................................................................59
Ищите уже созданные модели.............................................................................................................59
Разберитесь в истинных намерениях.........................................................................................60
Событийный штурм.........................................................................................................................60
Составление карты воздействий..................................................................................................61
Бизнес-модель организации..........................................................................................................63
Целенаправленное открытие........................................................................................................64
Водоворот исследования модели.................................................................................................65
Ключевые идеи..........................................................................................................................................66
Глава 3. Концентрация на смысловом ядре................................................................68
Зачем нужна декомпозиция предметной области........................................................................68
Как выделить суть задачи.....................................................................................................................69
Старайтесь понять, что стоит за требованиями......................................................................69
Составьте обзор предметной области, в котором обозначены ключевые моменты......70
Как сосредоточиться на главной задаче...........................................................................................71
Дистилляция предметной области задачи...............................................................................72
Смысловое ядро.................................................................................................................................74
Рассматривайте смысловое ядро как продукт, а не как проект...............................................75
Неспециализированные области.................................................................................................75
Поддерживающие области.............................................................................................................76
Как деление на подобласти формирует контур решения..........................................................76
Не все части системы требуют детальной проработки...............................................................76
Уделяйте больше внимания ясности границ, а не совершенству моделей...................77
Реализация смыслового ядра не обязана быть идеальной с самого начала.................78
Создавайте подобласти с прицелом на замену, а не на повторное использование....79
А что, если смысловое ядро отсутствует?........................................................................................79
Ключевые идеи..........................................................................................................................................79
Глава 4. Проектирование на основе модели...............................................................81
Что такое предметная модель?............................................................................................................82
Предметная область и ее модель..................................................................................................82
Аналитическая модель....................................................................................................................83
Программная модель.......................................................................................................................83
Программная модель служит основным представлением предметной модели..........84
Проектирование на основе модели....................................................................................................84
Проблемы, возникающие при заблаговременном проектировании................................85
Командное моделирование............................................................................................................86
Использование единого языка для связывания аналитической
и программной моделей.........................................................................................................................88
Язык переживет вашу программу...............................................................................................89
Язык бизнеса.......................................................................................................................................89
Перевод между языком разработчиков и бизнес-языком...................................................89
Совместная работа над созданием единого языка........................................................................90
Шлифовка языка на конкретных примерах............................................................................91
Учите экспертов в предметной области сосредоточиваться на задаче и не переходить к ее решению...92
Эффективные приемы формирования языка.........................................................................93
Как создавать эффективные предметные модели........................................................................94
Жертвуйте точностью, если она стоит на пути к хорошей модели..................................95
Включайте в модель только то, что имеет отношение к задаче........................................96
Предметные модели полезны лишь временно........................................................................97
Используйте недвусмысленную терминологию....................................................................97
Ограничивайте свои абстракции.................................................................................................97
Применяйте абстракции на правильно выбранном уровне...............................................98
Описывайте в абстракциях поведение, а не реализацию....................................................98
Воплощайте модель в коде как можно раньше и чаще........................................................99
Не останавливайтесь на первой же работоспособной идее................................................99
Когда следует применять проектирование на основе модели..................................................99
Не тратьте силы на моделирование, если это того не стоит............................................100
Сосредоточьтесь на смысловом ядре.......................................................................................100
Ключевые идеи.......................................................................................................................................101
Глава 5. Шаблоны реализации предметной модели...................................................102
Загружаемые примеры кода для этой главы...............................................................................102
Уровень предметной области............................................................................................................103
Шаблоны реализации предметной модели..................................................................................104
Предметная модель........................................................................................................................105
Сценарий транзакции...................................................................................................................109
Модуль таблицы.............................................................................................................................111
Активная запись.............................................................................................................................112
Анемичная предметная модель.................................................................................................112
Анемичная предметная модель и функциональное программирование....................113
Ключевые идеи.......................................................................................................................................117
Глава 6. Обеспечение целостности моделей предметной области с помощью ограниченных контекстов....118
Проблемы архитектур с единственной моделью.......................................................................119
Сложность модели может увеличиваться.............................................................................119
Работа нескольких групп над единственной моделью......................................................120
Неоднозначность языка модели................................................................................................121
Применимость предметных понятий......................................................................................121
Интеграция с унаследованным или сторонним кодом.....................................................124
Предметная модель не является моделью предприятия..................................................124
Использование ограниченных контекстов для декомпозиции больших моделей.........125
Определение границ модели......................................................................................................127
Создание контекстов на основе организации разработчиков........................................129
Различия между подобластями и ограниченными контекстами..................................132
Реализация ограниченных контекстов..........................................................................................132
Ключевые идеи.......................................................................................................................................136
Глава 7. Карты контекстов.....................................................................................137
Карта реальности..................................................................................................................................138
Техническая действительность.................................................................................................139
Организационная действительность.......................................................................................139
Отображение актуальной действительности.......................................................................141
Выделение смыслового ядра на карте.....................................................................................141
Определение отношений между ограниченными контекстами...........................................141
Предохранительный слой...........................................................................................................141
Общее ядро.......................................................................................................................................142
Служба с открытым протоколом..............................................................................................143
Отдельное существование...........................................................................................................144
Партнерство.....................................................................................................................................145
Отношения «вышестоящий/нижестоящий»........................................................................145
Отношения на карте контекстов......................................................................................................147
Стратегическая важность карт контекстов..................................................................................147
Сохранение целостности.............................................................................................................148
Основа для планирования работ..............................................................................................148
Понимание принадлежности и ответственности................................................................149
Вскрытие запутанных областей в рабочих процессах на предприятии......................149
Выявление нетехнических преград..........................................................................................149
Способствование налаживанию общения.............................................................................150
Ускорение адаптации новых разработчиков.........................................................................150
Ключевые идеи.......................................................................................................................................150
Глава 8. Архитектура приложения..........................................................................152
Загружаемые примеры кода для этой главы...............................................................................152
Архитектура приложения..................................................................................................................152
Разделение задач, решаемых приложением..........................................................................153
Отделение от сложностей предметной области..................................................................153
Многоуровневая архитектура....................................................................................................153
Инверсия зависимостей...............................................................................................................154
Предметный уровень....................................................................................................................155
Уровень прикладных служб.......................................................................................................155
Инфраструктурные уровни........................................................................................................156
Взаимодействия между уровнями...........................................................................................156
Тестирование в изоляции............................................................................................................157
Не используйте схему данных, общую для всех ограниченных контекстов.............157
Сравнение архитектур приложений и ограниченных контекстов................................158
Прикладные службы............................................................................................................................160
Прикладная и предметная логика............................................................................................162
Определение и экспортирование функций...........................................................................162
Координация выполнения сценариев использования......................................................163
Прикладные службы представляют сценарии использования,
а не CRUD-операции....................................................................................................................164
Предметный уровень как детали реализации......................................................................164
Отчеты о состоянии предметной модели...............................................................................164
Модели чтения и транзакционные модели...........................................................................165
Клиенты приложения..........................................................................................................................166
Ключевые идеи.......................................................................................................................................168
Глава 9. Типичные проблемы команд, начинающих применять предметно-ориентированное проектирование...170
Переоценка важности тактических шаблонов............................................................................171
Использование одной архитектуры для всех ограниченных контекстов...................171
Идеализация тактических шаблонов......................................................................................171
Ошибочное принятие строительных блоков за ценность DDD....................................172
Сосредоточенность на коде, а не на принципах DDD.......................................................172
Недооценка истинной ценности DDD: сотрудничество, общение и контекст................173
Получение «большого кома грязи» из-за недопонимания важности контекста.....174
Появление неоднозначности и недопонимания из-за неудач при создании
единого языка..................................................................................................................................174
Получение сугубо технических решений из-за недостатка взаимодействия...........175
Большие затраты времени на то, что не представляется важным.......................................176
Превращение простых задач в сложные.......................................................................................176
Применение принципов DDD к простым областям, не имеющим большого значения для предприятия..177
Отказ от шаблона CRUD как от антишаблона....................................................................177
Использование шаблона «Предметная модель» для всех ограниченных
контекстов.........................................................................................................................................178
Спросите себя: нужна ли эта дополнительная сложность?.............................................178
Недооценка стоимости применения DDD...................................................................................178
Попытка добиться успеха без мотивированных и целеустремленных
разработчиков..................................................................................................................................178
Сотрудничество с незаинтересованными специалистами...............................................179
Методологии неитерационной разработки...........................................................................179
Применение DDD к любым задачам.......................................................................................180
Жертвование простотой ради ненужной чистоты..............................................................180
Пустая трата сил на поиски подтверждений правоты......................................................180
Постоянное стремление к совершенству кода.....................................................................181
Цель DDD — обеспечить ценность..........................................................................................181
Ключевые идеи.......................................................................................................................................182
Глава 10. Применение принципов, приемов и шаблонов DDD...................................183
Загружаемые примеры кода для этой главы...............................................................................183
Внедрение DDD....................................................................................................................................183
Обучение разработчиков.............................................................................................................184
Общение со специалистами........................................................................................................184
Применение принципов DDD..........................................................................................................185
Понимание замысла......................................................................................................................185
Определение требуемой функциональности.......................................................................186
Понимание действительной картины.....................................................................................187
Моделирование решения............................................................................................................188
Исследования и эксперименты........................................................................................................196
Ставьте свои предположения под сомнение.........................................................................197
Моделирование — это текущая работа...................................................................................197
Не существует неправильных моделей..................................................................................197
Податливый код способствует раскрытию...........................................................................198
Превращение неявного в явное........................................................................................................198
Борьба с неоднозначностями.....................................................................................................199
Давайте названия...........................................................................................................................201
Сначала решение задачи, и только потом ее реализация........................................................201
Не решайте все задачи..................................................................................................................201
Как узнать, что все делается правильно?......................................................................................202
Не стремитесь к идеалу................................................................................................................202
Практика, практика и еще раз практика................................................................................203
Ключевые идеи.......................................................................................................................................203
Часть II. Стратегические шаблоны: взаимодействие
ограниченных контекстов...................................................................205
Глава 11. Введение в интеграцию ограниченных контекстов.....................................206
Загружаемые примеры кода для этой главы...............................................................................206
Как интегрировать ограниченные контексты.............................................................................207
Ограниченные контексты независимы...................................................................................208
Проблемы интеграции ограниченных контекстов на уровне программного кода..208
Использование физических границ для гарантий чистоты моделей..........................213
Интеграция с унаследованными системами.........................................................................214
Экспортирование унаследованных систем в виде служб................................................216
Интеграция распределенных ограниченных контекстов........................................................218
Стратегии интеграции распределенных ограниченных контекстов............................218
Интеграция через базу данных..................................................................................................219
Интеграция через простые файлы...........................................................................................220
RPC.....................................................................................................................................................221
Обмен сообщениями.....................................................................................................................222
REST...................................................................................................................................................223
Проблемы применения DDD в распределенных системах....................................................223
Проблемы с RPC............................................................................................................................224
Распределенные транзакции ухудшают масштабируемость и надежность...............227
Реактивная философия DDD и управление по событиям..............................................229
Проблемы и компромиссы асинхронных сообщений.......................................................231
Технология RPC все еще актуальна?......................................................................................232
Реактивная философия DDD и SOA.............................................................................................233
Представление ограниченных контекстов в виде служб SOA........................................234
Еще шаг вперед с архитектурой микрослужб......................................................................238
Ключевые идеи.......................................................................................................................................240
Глава 12. Интеграция посредством обмена сообщениями.........................................241
Загружаемые примеры кода для этой главы...............................................................................241
Основы обмена сообщениями..........................................................................................................242
Шина сообщений...........................................................................................................................243
Надежный обмен сообщениями................................................................................................244
Сохранить и передать...................................................................................................................245
Команды и события.......................................................................................................................245
Потенциальная непротиворечивость......................................................................................246
Создание приложения электронной коммерции с применением NServiceBus...............247
Проектирование системы............................................................................................................248
Отправка команд из веб-приложения.....................................................................................253
Отправка команд............................................................................................................................258
Обработка команд и публикация событий...........................................................................262
Увеличение надежности внешних вызовов HTTP с помощью
шлюзов сообщений........................................................................................................................270
Потенциальная непротиворечивость на практике.............................................................278
Ограниченные контексты хранят все необходимые им данные локально.................280
Объединяем все вместе в пользовательском интерфейсе................................................289
Сопровождение приложений, использующих обмен сообщениями..................................292
Поддержка версий сообщений..................................................................................................292
Мониторинг и масштабирование.............................................................................................298
Интеграция ограниченных контекстов с применением MASS TRANSIT........................301
Мост обмена сообщениями.........................................................................................................303
Mass Transit......................................................................................................................................303
Ключевые идеи.......................................................................................................................................311
Глава 13. Интеграция с RPC и REST посредством HTTP..........................................313
Загружаемые примеры кода для этой главы...............................................................................313
Преимущества HTTP..........................................................................................................................315
Независимость от выбора платформы....................................................................................315
HTTP понятен любому................................................................................................................315
Множество проверенных инструментов и библиотек......................................................316
Возможность пользоваться своими же API..........................................................................316
RPC............................................................................................................................................................317
Реализация RPC через HTTP....................................................................................................317
Выбор варианта RPC....................................................................................................................333
REST..........................................................................................................................................................334
Разоблачение мифов REST........................................................................................................334
REST для интеграции ограниченных контекстов..............................................................339
Сопровождение приложений REST........................................................................................375
Недостатки интеграции ограниченных контекстов с применением REST...............376
Ключевые идеи.......................................................................................................................................378
Часть III. Тактические шаблоны: создание эффективных
моделей предметной области..............................................................379
Глава 14. Знакомство со стандартными блоками моделирования
предметной области...............................................................................................380
Загружаемые примеры кода для этой главы...............................................................................380
Тактические шаблоны..........................................................................................................................381
Шаблоны моделирования предметной области.........................................................................382
Сущности..........................................................................................................................................382
Объекты-значения.........................................................................................................................385
Предметные службы.....................................................................................................................388
Модули...............................................................................................................................................389
Шаблоны жизненного цикла............................................................................................................390
Агрегаты............................................................................................................................................391
Фабрики............................................................................................................................................394
Репозитории.....................................................................................................................................395
Другие шаблоны....................................................................................................................................396
Предметные события....................................................................................................................396
Регистрация событий....................................................................................................................398
Ключевые идеи.......................................................................................................................................399
Глава 15. Объекты-значения...................................................................................402
Загружаемые примеры кода для этой главы...............................................................................402
Когда использовать объекты-значения.........................................................................................403
Представление описательного понятия, не имеющего индивидуальности...............403
Улучшение ясности........................................................................................................................404
Характерные особенности..................................................................................................................406
Отсутствие индивидуальности.................................................................................................406
Сравнение по атрибутам..............................................................................................................407
Разнообразие возможностей......................................................................................................411
Согласованность.............................................................................................................................411
Неизменяемость.............................................................................................................................411
Комбинируемость..........................................................................................................................413
Автоматическая проверка...........................................................................................................415
Простота тестирования................................................................................................................418
Общие шаблоны моделирования....................................................................................................420
Статические фабричные методы..............................................................................................420
Микротипы.......................................................................................................................................421
Отказ от коллекций.......................................................................................................................424
Сохранение..............................................................................................................................................427
NoSQL................................................................................................................................................427
SQL......................................................................................................................................................428
Ключевые идеи.......................................................................................................................................435
Глава 16. Сущности................................................................................................436
Загружаемые примеры кода для этой главы...............................................................................436
Понимание сущностей........................................................................................................................437
Предметные понятия с индивидуальностью и жизненным циклом............................437
Зависимость от контекста...........................................................................................................438
Реализация сущностей........................................................................................................................438
Идентификация..............................................................................................................................438
Включение логики в объекты-значения и предметные службы....................................445
Проверка и соблюдение правил................................................................................................448
Сосредоточьтесь на поведении, а не на данных...................................................................451
Избегайте ошибки «моделирования реального мира».....................................................454
Проектирование для распределенных окружений.............................................................455
Основные принципы и шаблоны моделирования сущностей...............................................457
Реализуйте проверки и инварианты с помощью спецификаций..................................457
Избегайте шаблона «Состояние»; используйте явное моделирование......................460
Избегайте использования методов чтения/записи с шаблоном «Хранитель»........464
Отдавайте предпочтение функциям без побочных эффектов.......................................465
Ключевые идеи.......................................................................................................................................466
Глава 17. Службы предметной области....................................................................468
Загружаемые примеры кода для этой главы...............................................................................468
Предметные службы............................................................................................................................469
Когда использовать предметные службы..............................................................................469
Внутреннее устройство предметной службы.......................................................................474
Избегайте шаблона «Анемичная предметная модель».....................................................475
Отличие от прикладных служб.................................................................................................475
Применение предметных служб......................................................................................................476
В уровне служб................................................................................................................................476
В предметной области..................................................................................................................477
Ключевые идеи.......................................................................................................................................484
Глава 18. События предметной области...................................................................485
Загружаемые примеры кода для этой главы...............................................................................485
Суть шаблона «Предметные события»..........................................................................................486
Важные предметные происшествия, которые уже случились........................................486
Реакция на события.......................................................................................................................487
Возможная асинхронность.........................................................................................................487
Внутренние и внешние события...............................................................................................488
Обработка событий..............................................................................................................................490
Вызов предметной логики..........................................................................................................490
Вызов прикладной логики..........................................................................................................490
Варианты реализации шаблона «Предметные события».......................................................490
Используйте модель событий .Net Framework....................................................................491
Использование шины памяти....................................................................................................493
Статический класс DomainEvents Уди Дахана....................................................................496
Возврат предметных событий....................................................................................................499
Использование контейнера IoC в качестве диспетчера событий..................................502
Тестирование предметных событий...............................................................................................503
Модульное тестирование............................................................................................................503
Тестирование прикладной службы..........................................................................................505
Ключевые идеи.......................................................................................................................................506
Глава 19. Агрегаты.................................................................................................508
Загружаемые примеры кода для этой главы...............................................................................508
Управление сложными деревьями объектов...............................................................................509
Однонаправленность предпочтительнее...............................................................................509
Ограничение связей......................................................................................................................512
Идентификаторы объектов предпочтительнее ссылок....................................................513
Агрегаты...................................................................................................................................................515
Проектирование на основе предметных инвариантов......................................................517
Более высокий уровень абстракции предметной области...............................................517
Маленькие агрегаты предпочтительнее.................................................................................523
Определение границ агрегатов.........................................................................................................525
eBidder: интернет-аукцион.........................................................................................................525
Согласование с инвариантами...................................................................................................527
Согласование с транзакциями...................................................................................................530
Игнорируйте требования пользовательского интерфейса..............................................531
Избегайте простых коллекций и контейнеров....................................................................532
Не зацикливайтесь на отношениях владения......................................................................532
Реорганизация агрегатов.............................................................................................................533
Главное — потребности сценариев использования, а не соответствие реальности......533
Реализация агрегатов...........................................................................................................................534
Выбор корня агрегата...................................................................................................................534
Ссылка на другие агрегаты.........................................................................................................538
Реализация хранения....................................................................................................................542
Реализация транзакционной согласованности....................................................................547
Реализация потенциальной согласованности......................................................................548
Поддержка одновременного доступа......................................................................................551
Ключевые идеи.......................................................................................................................................553
Глава 20. Фабрики.................................................................................................555
Загружаемые примеры кода для этой главы...............................................................................555
Роль фабрики.........................................................................................................................................556
Отделение использования от создания..................................................................................556
Сокрытие внутренних деталей..................................................................................................556
Сокрытие решения о выборе типа создаваемого объекта................................................559
Фабричные методы в агрегатах.................................................................................................560
Фабрики для восстановления....................................................................................................562
Практическое использование фабрик.....................................................................................563
Ключевые идеи.......................................................................................................................................564
Глава 21. Репозитории...........................................................................................565
Загружаемые примеры кода для этой главы...............................................................................565
Репозитории............................................................................................................................................565
Ошибочные представления о шаблоне..........................................................................................567
«Репозиторий» — это антишаблон?.........................................................................................568
Отличия между предметной моделью и моделью хранения...........................................568
Обобщенный репозиторий.........................................................................................................569
Стратегии хранения агрегатов..........................................................................................................573
Использование фреймворка сохранения, способного отобразить предметную модель в модель данных без компромиссов..........................................................................573
Использование фреймворка сохранения, не способного отобразить
предметную модель без компромиссов..................................................................................574
Общедоступные методы чтения и записи.............................................................................574
Шаблон «Хранитель»...................................................................................................................576
Потоки событий..............................................................................................................................578
Прагматизм......................................................................................................................................578
Репозиторий — четко определенный контракт..........................................................................579
Управление транзакциями и единицы работы...........................................................................580
Сохранять или не сохранять.............................................................................................................584
Фреймворки сохранения, автоматически определяющие изменения
в предметных объектах.................................................................................................................585
Необходимость явно сохранять агрегаты..............................................................................586
Репозиторий как предохранительный слой................................................................................587
Другие области ответственности репозитория...........................................................................588
Генерирование идентификаторов сущностей.......................................................................588
Обобщенные сведения о коллекциях......................................................................................590
Одновременный доступ...............................................................................................................591
Контрольные проверки................................................................................................................594
Антишаблоны реализации репозиториев.....................................................................................595
Антишаблон: поддержка универсальных запросов............................................................595
Антишаблон: отложенная загрузка..........................................................................................596
Антишаблон: использование репозиториев для составления отчетов........................596
Реализации репозиториев..................................................................................................................597
Фреймворк сохранения способен отобразить предметную модель
в модель данных без компромиссов.........................................................................................598
Фреймворк сохранения не способен отобразить предметную модель в модель данных без компромиссов...646
Ключевые идеи.......................................................................................................................................683
Глава 22. Регистрация событий...............................................................................684
Загружаемые примеры кода для этой главы...............................................................................684
Ограничения на хранение состояния в виде моментального снимка.................................685
Конкурентные преимущества от хранения состояния в виде потока событий...............686
Временные запросы.......................................................................................................................687
Проекции...........................................................................................................................................688
Моментальные снимки................................................................................................................689
Агрегаты с поддержкой регистрации событий...........................................................................689
Структурирование.........................................................................................................................690
Сохранение и восстановление...................................................................................................694
Решение проблем одновременного доступа.........................................................................698
Тестирование...................................................................................................................................700
Создание хранилища событий.........................................................................................................701
Проектирование структуры хранилища................................................................................702
Создание потоков событий.........................................................................................................703
Добавление событий в потоки...................................................................................................704
Извлечение потоков событий....................................................................................................704
Добавление поддержки моментальных снимков................................................................705
Управление одновременным доступом..................................................................................707
Хранилище событий на основе SQL Server..........................................................................711
Оправданно ли создание собственного хранилища событий?.......................................717
Использование специализированного хранилища событий.................................................718
Установка Event Store...................................................................................................................718
Использование клиентской библиотеки для C#................................................................718
Временные запросы.......................................................................................................................723
Создание проекций........................................................................................................................726
Шаблон CQRS и регистрация событий........................................................................................728
Использование проекций для создания кэшированных представлений...................729
Объединение CQRS с приемом регистрации событий.....................................................730
Еще раз о выгодах регистрации событий......................................................................................730
Конкурентные преимущества для предприятия.................................................................731
Выразительность поведения агрегатов...................................................................................731
Простота хранения........................................................................................................................731
Простота отладки...........................................................................................................................732
Оценка ценности регистрации событий.......................................................................................732
Поддержка версий.........................................................................................................................732
Необходимость освоения новых понятий и обретения навыков..................................732
Необходимость изучения новых технологий и овладения ими....................................733
Более строгие требования к емкости хранилища данных...............................................733
Дополнительные ресурсы..................................................................................................................733
Ключевые идеи.......................................................................................................................................733
Часть IV. Шаблоны проектирования эффективных приложений....735
Глава 23. Конструирование пользовательских интерфейсов приложения..................736
Загружаемые примеры кода для этой главы...............................................................................736
Основы проектирования....................................................................................................................737
Единые и составные пользовательские интерфейсы.........................................................737
HTML API и Data API.................................................................................................................740
Координация/компоновка на стороне клиента и сервера...............................................741
Пример 1: Пользовательский интерфейс на основе HTML API, с компоновкой информации из нераспределенных ограниченных контекстов на стороне сервера......743
Пример 2: Пользовательский интерфейс на основе DATA API, с компоновкой информации из распределенных ограниченных контекстов на стороне клиента..........751
Ключевые идеи.......................................................................................................................................758
Глава 24. CQRS: архитектура ограниченного контекста...........................................760
Загружаемые примеры кода для этой главы...............................................................................760
Проблемы использования единой модели для двух контекстов..........................................761
Архитектура, более подходящая для сложных ограниченных контекстов......................762
Команды: бизнес-задачи.....................................................................................................................763
Явное моделирование намерений............................................................................................763
Модель, свободная от задач представления..........................................................................765
Обслуживание бизнес-запросов...............................................................................................767
Запросы: информация о предметной модели..............................................................................768
Отображение отчетов непосредственно в модель данных...............................................769
Материализованные представления на основе предметных событий........................769
Ошибочные представления о шаблоне CQRS............................................................................771
Шаблон CQRS сложен в реализации......................................................................................771
Шаблон CQRS реализует потенциальную непротиворечивость..................................771
Модели должны поддерживать регистрацию событий....................................................772
Команды должны выполняться асинхронно........................................................................772
Шаблон CQRS работает только с системами обмена сообщениями...........................772
Шаблон CQRS требует использовать предметные события..........................................772
Шаблоны поддержки масштабируемости приложений..........................................................773
Масштабирование стороны чтения: потенциально непротиворечивая модель чтения.....774
Масштабирование стороны записи: асинхронные команды...........................................776
Масштабирование всего вместе................................................................................................778
Ключевые идеи.......................................................................................................................................778
Глава 25. Команды: шаблоны прикладных служб для обработки
бизнес-сценариев использования...........................................................................780
Загружаемые примеры кода для этой главы...............................................................................780
Различение прикладной и предметной логики..........................................................................781
Прикладная логика........................................................................................................................782
Предметная логика с точки зрения прикладной службы................................................793
Шаблоны прикладных служб...........................................................................................................794
Процессор команд..........................................................................................................................794
Публикация/подписка.................................................................................................................798
Шаблон запрос/ответ...................................................................................................................800
async/await........................................................................................................................................802
Тестирование прикладных служб....................................................................................................803
Используйте предметную терминологию.............................................................................803
Тестируйте как можно больше функциональных возможностей.................................805
Ключевые идеи.......................................................................................................................................806
Глава 26. Запросы: предметная отчетность..............................................................807
Загружаемые примеры кода для этой главы...............................................................................807
Предметная отчетность внутри ограниченного контекста.....................................................808
Создание отчетов на основе предметных объектов............................................................808
Прямое обращение к хранилищу данных..............................................................................815
Создание проекций из потоков событий...............................................................................821
Предметная отчетность по нескольким ограниченным контекстам...................................829
С использованием приемов составных пользовательских интерфейсов...................829
Отдельный контекст отчетов.....................................................................................................830
Ключевые идеи.......................................................................................................................................832