gpt4 book ai didi

php - ddd - 如何分离有界上下文和共享事件?

转载 作者:搜寻专家 更新时间:2023-10-31 20:34:58 24 4
gpt4 key购买 nike

我实际上正在阅读一本名为“PHP 中的 DDD”的书,以帮助我理解领域驱动设计。到目前为止一切都很好,但我很难理解如何在不耦合限界上下文的情况下实现一个特定主题:领域事件

假设我必须 BCs :

  • 付款:处理发票的生成,将其发送给客户等
  • Orders:处理订单的创建、它们的状态等。

Order 时,将调度OrderCreated 事件。Payments BC 通过订阅者捕获此事件,并创建发票。

问题是,如果我想完全分离两个 BC,OrderPlaced 事件应该放在哪里,因为它被两个 BC 使用?它应该住在两个 BC 之外吗?在他们两个?如果我想独立部署 Invoices 模块,而无需访问 Orders 模块及其 OrderPlaced 事件定义,会导致一些 fatal error 吗?

提前感谢您的回答!

最佳答案

The problem is, If I want to perfectly separate both BCs, where should the OrderPlaced Event live, since it's used by both BCs ? Should it live outside both BCs ? In both of them ?

我会将事件存储在拥有它的上下文中,即订单上下文。您打算如何分离上下文?它是物理/网络边界分离,还是仅仅是概念上的?

What if I want to deploy the Invoices module as a standalone, without having access to the Orders module, and its OrderPlaced event definition, would it cause some fatal errors ?

这取决于您使用 OrderPlaced 做什么。如果您从某种事件流订阅它,然后通过将其转换为内部发票概念在 InvoicesBC 中对其作出 react ,那么您可能会没事,因为您可以不部署订阅者。如果您在 InvoicesBC 中的代码无需了解 OrderPlaced 即可运行,那么您应该没问题

一般来说,有几种方法可以解决这个问题:

  1. 分享一个共同的定义。在 C# 中,(不确定 PHP 中的等价物是什么)过去我在 BC 中有一个单独的类库,用于另一个 BC 可能需要的事件(即 MyContext.Contracts dll),然后可以被引用其他卑诗省。这些作为内部 nuget 提要(包管理器的东西)发布,因此其他上下文可以保持最新。
  2. 订阅端序列化较弱。如果您正在订阅一个事件流,您可以处理它存储在其中的原始表示(即 JSON),而不是让一些库自动将它反序列化为一个对象。如果你走这条路,我建议一些 "contract tests"在发布端模仿订阅者会做什么。这将保护您免于违反与外界签订的契约(Contract)。

关于php - ddd - 如何分离有界上下文和共享事件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38198336/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com