2014-09-27 56 views
1

目前,我正在构建一个PHP应用程序,其中包含CQRS,ES和DDD的想法。让我们考虑这个包含5个问题的调查应用程序。参与者可以通过回答5个问题来回答调查问卷。CQRS + PHP:发生事件时的逻辑放置位置

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

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

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

你能帮助我吗?提前致谢!

+0

如果你可以请让我知道,如果我需要扩大我的答案的任何领域,或者如果答案不是你正在寻找考虑创造一个赏金,以吸引注意力。 – g18c 2014-10-06 05:28:28

回答

0

据我了解,你有几个领域中的概念在这里(原谅的术语,一个领域的专家发言加以调整):

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

您还有问题回答时的事件。

在放置逻辑,我会做的条款如下:

的应用服务将脚手架全部为表示层所需的部分(让我们假设这将是通过Web API调用)。

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

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

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

当决定一项调查完成:

您可能必须这样做时,它知道在客户端上的一些状态(当所有可用的问题已经回答了这个问题会知道)。

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

几个要点:

我实在不明白怎么事件采购或CQRS在这里解决问题,或者是这个学习的目的呢?

您可能希望通过忘记现在读取的模型,以及从存储库中补充Survey(无论是通过事件存储,ORM还是读取模型并不重要)来简化它 - 读取模型用于构建客户端查询事件流意味着重放所有事件的视图(geteventstore.com有一些称为投影的东西,可以在运行中构建这些视图)。

事件采购非常强大,可以深入了解业务,在本例中我可以认为将所选问题存储为一系列事件,您可以了解人们响应速度的快慢,他们改变主意的次数等

+0

谢谢!错过了这篇文章,对不起。这是一个真正的应用程序,不只是学习的目的。使用CQRS的全部想法就是您可以从中得到的统计数据就像您在最后一段中所说的那样!你为我做了一些更清楚的事情。我想我会将所有给出的答案存储在读取方面,再加上下一个问题(目前还没有答案)。客户可以浏览回答的问题并获得最后一个问题。当域名决定所有需要回答的问题时,将在读取端设置一个标志。 – 2014-10-08 07:54:30

相关问题