我们如何使订单能够侦听运输子域事件。
答案 0 :(得分:3)
简短的答案是Saga,类似于以下内容:https://github.com/idugalic/digital-restaurant/blob/master/drestaurant-libs/drestaurant-order/src/main/kotlin/com/drestaurant/order/domain/OrderSaga.kt#L104
长答案是:
两种服务都公开了消息传递API(可以发送给的命令,可以发送给的查询,可以订阅的事件)。在这种情况下,订购服务取决于运输服务。两种服务都实现子域模型(Order
不是整个域,可能是core / more important
子域)。订单域负责创建order
并在流程中验证此订单。运送负责交付订单,他们称该地点为运送。在“运送”上下文中,我们对订单及其内容的详细信息不感兴趣,我们对交货地址最感兴趣。
我在上一节中提到的订单传奇可以处理来自com.drestaurant.courier.domain.api.CourierOrderDeliveredEvent
服务的shipping/courier
事件,并在Order服务上调用命令以更新Order聚合的状态。重要的是要注意,在此示例中,我们在JAR文件中将消息作为类共享。您应该考虑仅共享/记录消息的架构(例如JSON),并在依赖的服务中拥有此API类的副本(不依赖于其他服务的公共API模块/ jar)。这样,您就可以依赖消息的序列化,并且可以自由地在依赖的服务中拥有此消息/类的稍有不同的副本(例如,您不必在另一侧反序列化消息的所有属性,您可以选择)。这将使您的服务更独立地部署,因为它们不会像以前那样共享任何模块/ jar。
我必须承认,讨论DDD中的概念并不总是那么容易,它们总是与上下文相关。不过,我希望这个答案可以让您对所遇到的问题有更多的了解。请填写以进一步讨论该主题。
最好, 伊万