база данных — CQRS + PHP: где разместить логику, когда событие происходит

В настоящее время я создаю PHP-приложение с идеями CQRS, ES и DDD. Давайте рассмотрим это опросное приложение с 5 вопросами. Участник может ответить на опрос, ответив на 5 вопросов.

5 вопросов могут быть запрошены со стороны чтения в правильном порядке. Но у вопроса могут быть условия. Например, не показывайте вопрос 2, когда B отвечает на вопрос 1. С ответом 1B следующий вопрос (ы) будет: 3, 4 и 5.

Клиент может запустить команду AnswerQuestion, обработчик обработает эту команду и сработает событие QuestionAnspted. На основе этого события обработчик события обновит сторону чтения, и клиент может запросить следующий вопрос. Если больше нет вопросов, спросите, участие будет завершено для участника (и может принять участие с новым участием).

Логика в опросе будет решать, какие вопросы задавать, а какие нет, основываясь на данном ответе, это чисто логика предметной области. Я изо всех сил, где разместить / применить эту логику. Также, где решить, когда участие будет завершено. Я думаю, что наиболее вероятным ответом будет: пусть опросник AR определит следующий вопрос на основе полученных ответов от участия. Или, поделитесь логикой в ​​сервисе, позвольте стороне чтения запрашивать вопросы и предоставленные ответы и применять общую логику к этому.

Можете ли вы помочь мне дальше? Заранее спасибо!

1

Решение

Как я понимаю, у вас есть пара понятий домена (простите терминологию, поговорите с экспертом по домену, чтобы уточнить их):

  • Вопрос (вопрос задается) Отношения (между вопросом)
  • Опрос (AR), состоит из нескольких Вопросов и содержит
  • Отображение отношений)
  • Представленный опрос

У вас также есть события, когда ответы на вопросы.

С точки зрения размещения логики я бы сделал следующее:

Служба приложения создала бы все необходимые части для уровня представления (предположим, что это будет через вызов Web API).

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

Клиент будет обрабатывать сопоставление отношений и, возможно, отображать текущие доступные вопросы в зависимости от текущего выбора через Angular или Knockout.

Если вы не хотите сохранять состояние на клиенте, я вместо этого получу список всех доступных опций в зависимости от текущего выбора (вы будете запрашивать этот новый список доступных опций каждый раз, когда на вашем клиенте происходит изменение).

Когда решить, что опрос завершен:

У вас может быть какое-то состояние на клиенте, которое знает, когда это будет сделано (оно будет знать, когда будут получены ответы на все доступные вопросы).

При обработке на сервере вам необходимо проверить это, создав объект домена и убедившись, что опрос завершен, и, если это так, сохраните отправленный опрос.

Пара моментов:

Я действительно не вижу, как Event Sourcing или CQRS решают проблему здесь, или это для целей обучения?

Возможно, вы захотите упростить его, забыв пока что о модели чтения и просто гидрировав Survey из репозитория (как это сделать, будь то хранилище событий, ORM или модель чтения, на самом деле не имеет значения) — используются модели чтения создавать представления, которые нужны клиенту, так как запрос потоков событий означает воспроизведение всех событий (в geteventstore.com есть нечто, называемое проекциями, которое может создавать эти представления на лету).

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

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]