目前我正在构建一个包含CQRS,ES和DDD思想的PHP应用程序。让我们考虑这个包含5个问题的调查应用程序。参与者可以通过回答5个问题来回应调查。
可以通过正确的顺序从阅读侧查询5个问题。但是,一个问题可能有条件。例如,当B回答问题1时,不要显示问题2.对于答案1B,下一个要问的问题是:3,4和5。
客户端可以触发命令AnswerQuestion,处理程序将处理该命令并触发QuestionAnswered事件。基于该事件,事件处理程序将更新读取端,并且客户端可以查询要询问的下一个问题。当问题没有进一步的问题时,参与者将完成参与(并且可以参加新的参与)。
调查中的逻辑将决定要问哪些问题,哪些不是基于给定的答案,这是纯域逻辑。 我正在努力放置/应用这种逻辑。还有在何时确定参与完成的时间。我认为最可能的答案是:让调查AR根据参与的给定答案确定下一个问题。或者,在服务中共享逻辑,让读取方查询问题并给出答案,并将共享逻辑应用于此。
你能进一步帮助我吗?提前谢谢!答案 0 :(得分:0)
据我了解,您在这里有几个域概念(请原谅术语,与域专家交谈以完善它们):
您还可以回答问题的答案。
在放置逻辑方面,我会执行以下操作:
应用程序服务将为表示层构建所有必需的部分(假设这将通过Web API调用)。
在应用程序服务上,我将保存整个请求的调查(按调查名称从存储库中获取)并将其传递给客户端。
客户端将处理关系的映射,并可能根据当前选择通过Angular或Knockout显示当前可用的问题。
如果您不想在客户端上存储状态,我会根据当前选择获取所有可用选项的列表(每次客户端发生更改时,您都会请求这个新的可用选项列表)。
何时确定调查已完成:
您可能在客户端上有一些状态知道何时完成(它将知道何时已回答所有可用问题)。
在服务器上进行处理时,您需要通过构建域对象并确认调查完成来验证这一点,如果存储,则存储提交的调查。
有几点:
我真的没有看到Event Sourcing或CQRS如何在这里解决问题,还是出于学习目的?
您可能希望通过暂时忘记读取模型使其变得更简单,并且只是从存储库中保存Survey(无论是通过事件存储,ORM还是读取模型,如何执行此操作并不重要) - 阅读模型用于构建客户端需要的视图,因为查询事件流意味着重放所有事件(geteventstore.com有一些叫做投影的东西可以动态构建这些视图)。
事件采购对于获得业务洞察力非常强大,我可以认为在这个例子中将选定的问题存储为一系列事件,您可以了解人们的反应速度,他们改变主意的次数等等