События и команды домена в распределенной системе (DDD)

Допустим, у меня есть распределенная архитектура (клиент-сервер). На стороне клиента есть класс ServerEntity, на стороне клиента - класс ClientEntity. Я хочу, чтобы ClientEntity просто запрашивал некоторые данные у ServerEntity. Я недавно начал изучать подход DDD, и на самом деле мне нравятся доменные события, поэтому я пошел с ним. Вот мое упрощенное ожидание будущей реализации:

  1. ClientEntity создает команду RequestDataCommand и публикует ее (например, через MessageBus)
  2. ApplicationLayer клиента получает эту команду, подключает ее и отправляет на сервер
  3. ApplicationLayer сервера получает команду и передает ее в MessageBus
  4. ServerEntity получает команду и публикует событие домена с некоторыми данными
  5. ApplicationLayer сервера получает эти события, подключает их и отправляет клиенту
  6. ApplicationLayer клиента получает событие и отправляет команду в DomainEventManager
  7. ClientEntity подписывается на событие, и при получении оно меняет некоторое внутреннее состояние.

Недостаток подхода, приведенного выше, состоит в том, что мы получим десятки командных классов.

С другой стороны, есть еще один вариант: мы создаем некоторый интерфейс службы домена, такой как IRequestDataService, и делаем его зависимостью для ClientEntity. Таким образом, нам не нужно создавать класс команд и передавать его на шину сообщений, мы просто вызываем соответствующий метод из IRequestDataService. Ответы от сервера принимаются как события домена, как в предыдущем примере.

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

Какой подход лучше, и я думаю, что правильный способ взаимодействия клиент-сервер?

1 ответ

Ваша RequestDataCommand не похожа на команду для меня.

Команда - это обязательная директива, использующая UL, которая изменяет состояние вашей системы. Запрос данных не меняет состояние, поэтому это не должна быть команда.

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

У меня сложилось впечатление, что вы пытаетесь использовать имеющуюся у вас инфраструктуру (события, шину сообщений и т. Д.), Чтобы делать то, чего не следует делать.

На мой взгляд, для чтения данных лучшим вариантом было бы обойти большую часть логики предметной области и просто прочитать данные наиболее простым и понятным способом. Посмотрите на CQRS ( http://martinfowler.com/bliki/CQRS.html - хорошее начало)

Другие вопросы по тегам