Влад Хононов

Что такое предметно-ориентированное проектирование?


(What is Domain-Driven Design?)

Глава 7. Интеграция ограниченных контекстов
В Главе 5 вы узнали о паттернах предметно-ориентированного проектирования, определяющих интеграции между ограниченными контекстами. В этой главе мы кратко обсудим эти паттерны с точки зрения проектирования.
Партнёрство и общее ядро
Паттерны партнерства и общего ядра требуют хорошего взаимодействия между командами и максимальной синхронизации работы. Поэтому важно вкладываться в интеграционные тесты, которые будут проверять взаимодействие между ограниченными контекстами. Также необходимо настроить непрерывный интеграционный поток, который будет постоянно выполнять эти тесты и предоставлять быструю обратную связь о внесённых изменениях.
Предохранительный уровень
Этот паттерн защищает нижестоящий контекст от неудобной модели, предоставленной вышестоящим контекстом. Он преобразует модель, предоставленную поставщиком услуги, в модель, ориентированную на потребности потребителя. Такое преобразование можно реализовать разными способами:

Локальный кэш
Потребитель в нижестоящем контексте может реализовать задачу, которая извлекает данные из вышестоящего сервиса, преобразует их и сохраняет результат в локальном кэше. При необходимости этот кэш можно очистить и восстановить с нуля.
Этот подход очень похож на реализацию проекций в архитектуре CQRS.

Сервис-адаптер
Потребитель в нижестоящем контексте может передавать все запросы вышестоящему сервису через специальный пользовательский сервис. Адаптер будет вызывать вышестоящий контекст, преобразовывать результат и возвращать его вызывающей стороне (рисунок 7-1).

Рисунок 7-1. Сервис-адаптер как предохранительный уровень

Сервис с открытым протоколом
В этом паттерне для защиты потребителей от изменений в реализации, которые их не затрагивают, вышестоящий контекст разделяет свою модель реализации и модель, используемую как общедоступный интерфейс сервиса — публичный язык.

Важно, чтобы публичный язык был хорошо документирован и удобен для потребителей. Swagger — хороший вариант для ведения такой документации; он также позволяет генерировать модель для публичного языка, который должен реализовать провайдер сервиса.
Событие предметной области
В системах, основанных на событиях, может возникнуть искушение использовать события предметной области как часть общедоступного интерфейса сервиса. Однако сначала стоит задать себе вопрос, удобны ли эти события предметной области для потребителей. Во многих случаях лучше оставлять события предметной области приватными, но использовать их для проекции публичных событий. Публичные события предметной области обычно более ограничены и оптимизированы под интеграционные потребности.