CQRS+PHP:当事件发生时,在哪里放置逻辑


CQRS + PHP: Where to place logic when event is happened

目前我正在用CQRS、ES和DDD的思想构建一个PHP应用程序。让我们把这看作一个有5个问题的调查申请。参与者可以通过回答5个问题来回答调查。

这5个问题可以从阅读端按照正确的顺序进行查询。但是,一个问题是有条件的。例如,当B回答问题1时,不要显示问题2。对于答案1B,下一个问题将是:3、4和5。

客户端可以触发命令AnswerQuestion,处理程序将处理该命令,并触发事件QuestionAnswered。基于该事件,事件处理程序将更新读取端,客户端可以查询下一个问题。当没有进一步的问题时,参与者的参与将完成(并且可以参加新的参与)。

调查中的逻辑将根据给定的答案来决定该问哪些问题,不该问哪个问题,这是纯粹的领域逻辑我很难把这个逻辑放在哪里。以及在哪里决定何时完成参与我认为最有可能的答案是:让调查AR根据参与者给出的答案来确定下一个问题。或者,共享服务中的逻辑,让读取方查询问题和给出的答案,并将共享逻辑应用于此。

你能进一步帮我吗?提前感谢!

据我所知,这里有几个领域概念(请原谅术语,请与领域专家交谈以完善它们):

  • 问题(被问的问题)关系(问题之间)
  • 调查(AR)由多个问题组成,包含
  • 关系映射)
  • 提交的调查

当问题得到回答时,您也有活动。

就放置逻辑而言,我将执行以下操作:

应用程序服务将为表示层构建所有必需的部分(假设这将通过Web API调用实现)。

在应用程序服务上,我会对整个请求的调查进行水合(按调查名称从存储库中提取),并将其传递给客户端。

客户端将处理关系的映射,并可能显示当前可用的问题,这取决于通过Angular或Knockout进行的当前选择。

如果你不想在客户端上存储状态,我会根据当前选择获得所有可用选项的列表(每次客户端发生更改时,你都会请求这个新的可用选项列表)。

何时决定调查完成:

你可能在客户端上有一些状态,它知道什么时候完成(它会知道什么时候所有可用的问题都得到了回答)。

在服务器上进行处理时,您需要通过构建域对象并确认调查完成来验证这一点,如果完成了,还需要存储提交的调查。

几点:

我真的不明白事件采购或CQRS是如何解决这里的问题的,或者这是为了学习吗?

你可能想通过暂时忘记读取模型来简化它,只需从存储库中对调查进行水合(如何做到这一点,无论是通过事件存储、ORM还是读取模型,都无关紧要)-读取模型用于构建客户端需要的视图,因为查询事件流意味着回放所有事件(geteventstore.com有一种称为投影的东西,可以实时构建这些视图)。

事件源可以非常强大地为业务获取洞察力,我认为在这个例子中,将所选问题存储为一系列事件,你可以了解人们的反应速度、他们改变主意的次数等。