domain-driven-design - @Service 注入聚合?
问题描述
我有一个Order
包含以下命令的聚合:
CreateOrderCommand
PlaceOrderCommand
- ...(其余部分与问题无关,因此已编辑)...
PlaceOrderCommand
是指将其放置到Order
外部执行场所。我已经捕获了在单独的(非 CQRS)中向外部执行场所下订单的行为@Service
。然而,我正在努力(由于缺乏使用 Axon 的经验)如何最好地将我@Service
与聚合体联系起来。
我的正常思维方式会让我:
- 将 注入
@Service
到聚合的@Autowired
构造函数中。 - 发出时
PlaceOrderCommand
,使用该服务将订单下达到相关的执行场所,并在完成后发出一个事件(要么 要么OrderPlacedSuccessfullyEvent
)ErrorInOrderPlacementEvent
。 - 在相关的
@EventSourcingHandler
.
我的问题是:
- 我上面关于如何使用 Axon 处理这个特定用例的描述是否有意义(特别是向
@Service
聚合中注入 a 对我来说感觉有点不对劲)? - 或者在将 CQRS/事件溯源与 Axon 一起使用时,是否有不同的最佳实践来模拟我的场景?
- Axon 在聚合中需要一个空的构造函数。这与拥有
@Autowired
构造函数如何协调?
我可能考虑的另一件事是:
- 有一个
PlaceOrderInstructionCommand
(而不是简单的PlaceOrderCommand
),它发出ReceivedPlaceOrderInstructionEvent
一个单独的事件侦听器正在侦听的。 - 该事件侦听器会将相关
@Service
信息注入其中并放置Order
. - 然后在放置之后
Order
它会发送一个命令(或者它应该发出一个事件?)到聚合通知它更新它的状态。
您能否建议对这种情况进行建模的最佳实践是什么?
解决方案
PlaceOrderCommand 是指将订单放置到外部执行场所。
我假设将订单放置到外部执行场所意味着与外部系统进行交互。如果是,那么它不应该是您的域的一部分。在这种情况下,您需要提出一个Integration Event
.
正如您所提到的,您可以从您的域中获得一个Command
赞ProcessOrder
。在其中Command
,您可以更新您的Domain
(例如,设置OrderStatus
为Processing
)并引发一个集成事件OrderArrived
,然后由一个单独的进程处理该事件。
从微软文档:
集成事件的目的是将提交的事务和更新传播到其他子系统,无论它们是其他微服务、限界上下文还是外部应用程序。
集成事件必须基于多个微服务(其他限界上下文)甚至外部系统/应用程序之间的异步通信。
您可以将该集成事件作为Domain
. 这是您@Service
将被注射的地方。一旦成功处理了订单,您就可以广播名为 的集成事件OrderPlaced
。
现在,任何与下订单有关的订阅者都将订阅该事件。在您的情况下,您Domain
有兴趣在下订单后更新状态。因此,您将在您Subscribe
的OrderPlaced
事件中Domain
更新Order
.
希望能帮助到你。
推荐阅读
- three.js - Three.js:纹理加载不正确
- flutter - 如何在颤振中使用 rxdart 实现 bloc?
- python - 在 Python 中命名布尔值时有哪些规定?
- regex - 正则表达式查找没有双“L”的单词
- python - 如何在python中使用startswith将大txt文件拆分成小txt文件?
- botframework - How to Start a Bot with the Microphone On on Botframework V4 and Webchat
- java - 获取离用户最近的医院名称,而无需使用实际的 Google 地图,只需使用地点 api
- python-3.x - GEKKO 中优化问题的并行化
- java - 当所有映射都返回 ResponseEntity 时,如何测试 @RestController?
- angular - Angular 和 Firestore:如何使用 observables 合并数据?