【问题标题】:@Service injection into aggregates?@Service 注入聚合?
【发布时间】:2020-01-27 15:35:10
【问题描述】:

我有一个带有以下命令的 Order 聚合:

  • CreateOrderCommand
  • PlaceOrderCommand
  • ...(其余部分与问题无关,因此已编辑)...

PlaceOrderCommand 是指将Order 放置在外部执行场所。我已经捕获了在单独的(非 CQRS)@Service 中将订单下达到外部执行场所的行为。但是,我正在努力(由于缺乏使用 Axon 的经验)如何最好地将我的 @Service 与聚合连接起来。

我的正常思维方式会影响我:

  • @Service 注入聚合的@Autowired 构造函数。
  • 发出PlaceOrderCommand 时,使用该服务将订单下达到相关执行场所,完成后发出事件(OrderPlacedSuccessfullyEventErrorInOrderPlacementEvent)。
  • 在相关的@EventSourcingHandler 中更改聚合的状态。

我的问题是:

  • 我上面关于如何使用 Axon 处理这个特定用例的描述是否有意义(特别是在聚合中注入 @Service 对我来说感觉有点不对劲)?
  • 或者在将 CQRS/事件溯源与 Axon 结合使用时,是否有不同的最佳实践来模拟我的场景?
  • Axon 在聚合中需要一个空的构造函数。这如何与 @Autowired 构造函数相协调?

我可能考虑的另一件事是:

  • 有一个PlaceOrderInstructionCommand(而不是简单的PlaceOrderCommand),它发出一个单独的事件侦听器正在侦听的ReceivedPlaceOrderInstructionEvent
  • 该事件侦听器会将相关的@Service 注入其中,并放置Order
  • 然后在放置 Order 之后,它会向聚合发送一个命令(或者它应该发出一个事件?),通知它更新其状态。

您能否建议对这种场景建模的最佳做法是什么?

【问题讨论】:

    标签: domain-driven-design axon


    【解决方案1】:

    PlaceOrderCommand 是指将订单放置到外部执行场所。

    我假设将订单下达到外部执行场所意味着与外部系统进行交互。如果是,那么它不应该是您的域的一部分。在这种情况下,您需要提出Integration Event

    正如您所提到的,您可以从您的域中提出 Command 之类的 ProcessOrder。在该Command 中,您可以更新您的Domain(例如,将OrderStatus 设置为Processing)并引发像OrderArrived 这样的集成事件,然后由单独的进程处理。

    来自Microsoft Docs

    集成事件的目的是将提交的事务和更新传播到其他子系统,无论它们是其他微服务、限界上下文还是外部应用程序。

    集成事件必须基于多个微服务(其他限界上下文)甚至外部系统/应用程序之间的异步通信。

    您可以将该集成事件作为Domain 之外的单独进程(或工作人员)处理。这是 your@Service 将被注入的地方。一旦订单处理成功,您就可以广播名为OrderPlaced 的集成事件。

    现在,任何与下订单有关的订阅者都将订阅该事件。在您的情况下,您的Domain 有兴趣在下订单后更新状态。因此,您将在您的Domain 中将SubscribeOrderPlaced 事件以更新Order 的状态。

    希望对你有帮助。

    【讨论】:

    • 谢谢你,这让事情变得更清楚了。关于位于域外的单独进程/工作人员:您是否有任何链接说明如何最好地对 Axon 框架进行建模?
    • 嗨@vab2048,我没有使用Axon 框架的经验,但我想这些概念仍然保持不变。查看此链接:docs.microsoft.com/en-us/dotnet/architecture/microservices/… 它会让您对微服务、领域事件和集成事件有一个很好的了解。
    猜你喜欢
    • 1970-01-01
    • 2011-01-27
    • 1970-01-01
    • 2014-02-26
    • 1970-01-01
    • 2017-06-05
    • 2014-12-01
    • 2012-10-01
    • 2016-11-18
    相关资源
    最近更新 更多