2016-03-08 57 views
0

我有一些用户数据的RegisterUserCommand。在ES/CQRS中获取第三方数据的最佳位置

为了能够使用一些额外的信息来注册用户,我需要连接到第三方所以我的问题是:

1)应该已经命令拥有所有第三方数据调用时?

2)如果CommandHandler连接到第三方并检索它会好吗?

3)我不认为我的聚合根应该这样做,但从某种意义上说,它是域逻辑。

我认为#2是最好的方法,但想听听我是否会出错。

(实际情况是不是注册用户,但它需要从远程服务获取数据/第三方)

+1

为了将用户添加到您的域中,信息100%是必需的,那么命令处理程序应该获取信息。如果没有,请将用户添加到域中,并让“UserCreated”事件获取数据。 – janhartmann

+0

是的,第三方数据在这个阶段是至关重要的。 BTW。我如何按事件做到这一点?我的意思是,没有命令(或实际命令处理程序)只有那些应该改变聚集? – Miro

+0

你能提供一些代码吗?事实上,这个问题非常模糊。 – theMayer

回答

0

与问题(2)您的域名层(其中命令处理程序绝对属于)成为依赖一个外部有界的上下文。这打破了洋葱结构内层隔离。

对于某些情况,您的第一点基本上是正确的,如果您的服务层可以获取此数据并发送独立命令,这是可能的解决方案之一。

另一种不是调用命令处理程序的解决方案,您可以发送消息来启动一个流程管理器,它将发送信息收集请求,获取数据并发送命令给您的处理程序并提供所有必需的信息。由于这是通过异步消息传递发生的,因此即使第三方出现故障(至少在某种程度上),并且第三方唤醒时,您的第三方也不会有同步依赖关系,并且所有排队的请求都会被处理。

通常,持久消息传递还具有一些重试功能,可以降低对外部有界上下文请求失败的风险。

0

您的第三方数据不属于您的域的一部分,但是它是必需的,因此您可以使用导致外部流程订阅的“数据请求”事件的命令。然后,该过程可以收集所需的第三方数据并将其打包到另一个命令中,从而导致另一个事件指出数据已提供,这会导致您的查询数据被更新。

相关问题