CQRS Read Models & REST API - PullRequest
       78

CQRS Read Models & REST API

0 голосов
/ 31 марта 2020

Мы внедряем REST API поверх наших сервисов CQRS. Мы, конечно же, не хотим предоставлять доступ к любому нашему домену пользователям API REST.

Однако ключевой принцип CQRS заключается в том, что модели чтения обычно соответствуют конкретному представлению или экрану c.

  1. В таком случае кажется логичным, что ресурсы в нашем REST API будут отображаться практически 1: 1 с моделями чтения / просмотра из наших запросов (где запросы возвращают DTO, содержащий все данные для просмотра). Технически это представляет часть нашего домена (модели чтения - хотя и возвращаются как DTO). В этом случае, кажется, это то, что мы хотим. Есть ли потенциальные недостатки в такой тесной связи?

  2. С точки зрения команд я рассматривал такой подход: https://www.slideshare.net/fatmuemoo/cqrs-api-v2. Есть слайд, который показывает, что команды не являются гражданами первого класса. (См. Слайд 26). В целом, правильно ли я предположить, что DTO, возвращаемые из моих запросов, всегда будут гражданами первого класса, которые затем будут выставлять команды, которые могут быть выполнены для этого экрана?

Спасибо

1 Ответ

1 голос
/ 31 марта 2020

Есть ли какие-либо потенциальные недостатки в такой тесной связи?

Вам нужно быть немного осторожнее с точки зрения понимания направления ваших зависимостей.

В частности, если вы пытаетесь интегрировать с клиентами, которые не контролируют , то вы захотите договориться о контракте - семантике и схеме сообщений - который вы не можете изменить в одностороннем порядке.

Это означает, что представления относительно фиксированы, но у вас есть много свободы в том, как вы реализуете создание этого представления. Вы даете обещание клиенту, что он может получить представление отчета 12345, и он будет иметь удобное расположение информации. Но то, является ли это представление чем-то, что вы производите по требованию, или чем-то, что вы кешируете, и то, как вы его создаете, полностью зависит от вас.

На этом уровне вы на самом деле не связываете своих клиентов с моделью вашего домена. ; вы связываете их с вашими представлениями / отчетами, то есть с вашей моделью data . И в мире CQRS это соединение с моделью чтения, а не с правильной моделью.

С точки зрения команд я рассматривал такой подход, как ...

Я собираюсь мягко предположить, что у автора в 2015 году не было особенно хорошего понимания REST по сегодняшним стандартам.

Основная проблема c в том, что автор не признать, что кэширование является REST-ограничением ; и при разработке наших протоколов HTTP необходимо учитывать, как компоненты общего назначения понимают аннулирование кэша .

Обычно для команды (имеется в виду «сообщение, предназначенное для изменения представления ресурса»). ), вы обычно хотите, чтобы target-uri HTTP-запроса совпадал с идентификатором основного ресурса, который изменяется.

POST /foo/123/command

Не особенно полезен с точки зрения аннулирования кэша, если никто никогда не отправляет GET /foo/123/command запрос.

...