我对状态流有疑问,我将尝试将其分解为一个非常简单的示例:
我正在使用不同的状态,可以说是原始的,添加的和计算的。
我的状态由一个要添加的int组成,在两次添加后,我想计算加倍的数量,然后再次将其设置为原始。
因此,现在我将以原始流int = 0开始。在转换中,我对addNumber
事件做出反应,从事件数据中取出一个int并将其添加到我的状态,然后我{{1 }}。
我重复一遍,添加另一个数字和transitionTo('add')
。
在我的反应中,我现在对加法和计算之间的过渡作出反应,并将新状态设置为将int数量加倍。
我现在要使用的是该号码,例如发送包含该号码的命令,然后重置状态和transitionTo('calculate')
。
问题是:我无法设置状态,也无法转换。
您如何解决这个问题?
在这里您具有实际的代码,因此它变得更容易理解:
transitionTo('pristine')
https://gist.github.com/DrFelder/122a72ffed3eb239a1a3ae33c99ea00d
答案 0 :(得分:2)
基本上,对此有两种想法:
startWork
,endWork
,pause
和resume
等命令,以所需的状态,将其建模为一个聚合,然后您可以拥有自己的逻辑希望包含在该聚合中。您可以每人使用一个汇总,也可以每个状态块使用一个汇总。无论哪种方式,这都应该起作用。因此,换句话说:为什么要以流而不是聚合的方式实现这个特殊的原因?pristine
和calculating
之间没有区别。因为,您实际上想要拥有的是某种圆形,但是您的流程并未建模为圆形。因此,如果您不是最终过渡到calculating
,而是过渡到pristine
,而是处于所需状态,并且在present->pristine
的反应之内,则可以执行所需的计算并发送带有计算数据的命令(实际上,是对过渡的反应)。这有助于澄清一些事情吗?
PS:也许更明确地命名也将有所帮助,例如具有paused
和resumed
而不是pauseSwitched
。这将需要较少的逻辑来弄清楚发生了什么事情的意图,而这基本上是DDD的优势之一,使其具有在措辞上明确的能力。因为,正如它现在所命名的,它更多是一种updated
事件(应该避免)。