【发布时间】:2018-11-28 22:13:59
【问题描述】:
我会简化我的问题:
我的 LightsState API 可以接收 2 种类型的输入:lightOn {lightId: ##} 和 lightOff {lightId: ##}。 (AMQP 输入,但此处无关)
这些输入可以很好地转换为 2 个命令:TurnLightOnCmd 和 TurnLightOffCmd。
这些命令将创建 2 个事件:LightTurnedOnEvent 和 LightTurnedOffEvent。
这些事件将应用于Light Aggregate,而持久化的投影将是state of the light。
到这里为止一切顺利。
但是因为没有输入:create light,我无法从中生成CreateLightCmd。我只能在收到带有新的lightId 的lightOn 输入时调用CreateLightCmd,以创建Light Aggregate,然后在其上应用TurnLightOnCmd。
我不确定如何处理这个问题,也不确定如何遵循良好的 CQRS 实践。
是否可以从命令端调用查询端来检查light exists by id,然后在需要时先调用CreateLightCmd?
或者我应该从命令端进行数据库查询并保持命令端和查询端分离?
或者有其他解决方案吗?
谢谢
【问题讨论】:
-
我只能在收到带有新 lightId 的 lightOn 输入以创建 Light Aggregate 然后在其上应用 TurnLightOnCmd 时调用 CreateLightCmd - 这是由你的背景?看起来非常复杂。
-
这不是一个约束,但聚合的创建应该通过显式命令完成,这就是我建议
CreateLightCmd的原因。 -
我现在正在尝试直接调用事件存储来检查
lightId的唯一性。这样至少命令端和查询端是分开的。 -
我的意思是,客户端在创建 Light 时是否绝对必须提前知道 ID,以及为什么首先将
TurnLightOn与CreateLight关联起来?
标签: java domain-driven-design cqrs eventsource axon