CQRS + PHP:事件发生时在何处放置逻辑

时间:2014-09-27 14:16:28

标签: php database events domain-driven-design cqrs

目前我正在构建一个包含CQRS,ES和DDD思想的PHP应用程序。让我们考虑这个包含5个问题的调查应用程序。参与者可以通过回答5个问题来回应调查。

可以通过正确的顺序从阅读侧查询5个问题。但是,一个问题可能有条件。例如,当B回答问题1时,不要显示问题2.对于答案1B,下一个要问的问题是:3,4和5。

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

调查中的逻辑将决定要问哪些问题,哪些不是基于给定的答案,这是纯域逻辑。 我正在努力放置/应用这种逻辑。还有在何时确定参与完成的时间。我认为最可能的答案是:让调查AR根据参与的给定答案确定下一个问题。或者,在服务中共享逻辑,让读取方查询问题并给出答案,并将共享逻辑应用于此。

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

1 个答案:

答案 0 :(得分:0)

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

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

您还可以回答问题的答案。

在放置逻辑方面,我会执行以下操作:

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

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

客户端将处理关系的映射,并可能根据当前选择通过Angular或Knockout显示当前可用的问题。

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

何时确定调查已完成:

您可能在客户端上有一些状态知道何时完成(它将知道何时已回答所有可用问题)。

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

有几点:

我真的没有看到Event Sourcing或CQRS如何在这里解决问题,还是出于学习目的?

您可能希望通过暂时忘记读取模型使其变得更简单,并且只是从存储库中保存Survey(无论是通过事件存储,ORM还是读取模型,如何执行此操作并不重要) - 阅读模型用于构建客户端需要的视图,因为查询事件流意味着重放所有事件(geteventstore.com有一些叫做投影的东西可以动态构建这些视图)。

事件采购对于获得业务洞察力非常强大,我可以认为在这个例子中将选定的问题存储为一系列事件,您可以了解人们的反应速度,他们改变主意的次数等等