1

只是为了澄清:当执行不仅仅是状态更新时,命令的执行在哪里(就像在网上找到的大多数示例一样)

例如,就我而言,

  • 命令FetchLastHistoryChangeSet,它包括根据我们上次离开的位置从外部服务获取最后一个历史变更集。换句话说就是上一个历史ChangeSet Fetched的最新变化的时间。

  • 事件将是HistoryChangeSetFetched(changeSet, time)。与上面所说的相关,时间应该是新历史 ChangeSet Fetched 的最新更改的时间(根据当前正在处理的命令事件)

现在在我看到的所有示例中,它始终是:(i)验证命令,然后,(ii)持久化事件,最后(iii)处理事件

处理事件时,我看到除了 updatestate 逻辑之外还添加了自定义代码。其中,自定义代码通常在更新状态函数之后添加。但是这个习惯大部分时间是关于将消息发送回发送者,或者将它广播到事件总线。

根据我的示例,很明显我需要做很少的操作来实际调用 Persist (HistoryChangeSetFetched(changeSet, time))。事实上,我需要新的变更集,以及最新变更的时间。

我认为可能的唯一方法是在验证命令中进行获取

那是:

case FetchLastHistoryChangeSet => val changetuple = if ValidateCommand(FetchLastHistoryChangeSet) persit(HistoryChangeSetFetched(changetuple._1, changetuple._2)) { historyChangeSetFetched =>
  updateState(historyChangeSetFetched)
}

ValidateCommand(FetchLastHistoryChangeSet) 在哪里

作为逻辑,读取最后一个 changeSet 时间(changeSet 的最新更改),基于它获取一个新的 changeset,如果它存在,获取其最新更改的时间,并返回元组。

我的问题是,它应该如何工作。验证命令可以像那样复杂吗?即实际执行命令?

4

1 回答 1

1

正如它在文档中所说:“验证可以意味着任何事情,从简单检查命令消息的字段到与多个外部服务的对话”

所以我认为你正在尝试做的事情是完全正确的。与外部服务的任何交互都必须在命令验证阶段完成。

于 2016-04-07T06:08:03.973 回答