【问题标题】:DDD UI composition across multiple contexts on creation创建时跨多个上下文的 DDD UI 组合
【发布时间】:2021-03-06 20:06:51
【问题描述】:

基于 Mauro Servienti 的演讲,题为“我们所有的聚合都是错误的。这是供参考的链接:https://www.youtube.com/watch?v=KkzvQSuYd5I

我们可能有一些有界上下文,每个上下文都包含一个项目的信息。

例如

  • 营销背景 - 名称、描述、图片
  • 销售背景 - 标价、产品代码?
  • 库存 - 库存水平

每个上下文可能都有自己的名称,例如库存可能称之为销售项目。

我认为销售可能是一个项目的所有者,所以当你去创建一个项目时,它就是将被创建的地方。

我有两个问题。

UI 是否单独调用这些上下文?

如果我有一个 UI 来创建产品/项目并获取营销和销售数据(标价、产品代码、名称、描述),我相信 UI 会进行两个单独的调用。

第一次调用销售上下文以创建项目,这将发布 ItemCreated 事件或类似事件。 第二次调用将针对营销上下文设置名称、描述等...

这对吗?

营销项目 所以我对库存服务的理解是,它将侦听销售 ItemCreated 事件,然后为其表示一个项目(库存项目)创建自己的聚合/流

另一方面,对于营销,如果我有一个 UI,我在其中创建带有销售额的项目,然后需要在营销中设置数据,那么 UI 是否会等待在营销中创建项目,然后再设置标题和描述? UI 是否会轮询市场营销上下文,直到项目被创建,然后执行命令来更新数据?

【问题讨论】:

    标签: domain-driven-design event-driven


    【解决方案1】:

    我过去做过类似的事情。

    我发现的最佳方法是:

    首先,您必须找到该物品的主要所有者。在我的例子中,它是一个产品目录。

    目录中有产品意味着公司打算使用该产品,即使没有库存、营销活动或任何东西。这本身就是一个聚合,它的操作(将产品添加到目录)是完全事务性的,因为即使事件 ProductAddedToCatalog 未能应用于其他有界上下文(BC)(因为基础设施失败)我不必撤消或协调/编排任何东西。只需重试引发事件。目录 BC 保持一致状态。

    对于其他 BC;应用事件意味着他们使用空/默认值创建其条目。即在 Warehouse BC 中,该条目是使用 0 库存及其相关的产品目录 ID 创建的。在营销方面,该条目被创建为迄今为止没有营销活动的产品。与其他 BC 等等。

    我如何为此建模 UI 任务?我像向导一样创建了几个屏幕。

    第一个屏幕询问产品目录信息。它的唯一任务是在目录中插入新产品。

    下一个屏幕询问仓库信息,但没有插入;它正在使用通过应用在第一步中引发的 ProductAddedToCatalog 事件创建的默认值更新条目。

    这样,如果仓库步骤失败,系统会保持其一致状态,用户可以稍后使用 UI 任务更新 Warehouse BC 中的产品库存。

    【讨论】:

    • 所以我正在关注,但我有几个问题。所以你提到,除了所有者之外的任何其他 BC 都应该默认数据,然后使用命令更新它。在 Mauro 的视频中,这是否意味着该项目的名称在设置之前一直是空白/默认的?如果数据不能默认,它应该与所有者 BC 一起吗?
    • 与其他 BC 的收听目录/所有者创建甚至相关,所以他们为产品创建自己的聚合?所以例如仓库是否会监听 ProductAddedToCatalog 并为 id 和任何特定于其 BC 的数据创建自己的 Product(或 StockProduct)聚合?这会引发它自己的事件,例如 StockProductCreated 吗?
    • @Matster2 1. 您无法将 1:1 与 Mauro 示例进行比较,因为在视频中,所有与产品相关的数据都已经存在,而购物车是这些数据之间的“关系”。 2. 两者都是。
    • 非常感谢您的帮助。所以在存货 BC 我们有一个 StockProduct Aggregate。我们是否必须等待它被创建(最终与事件一起),然后才能在没有信息的情况下更新它,或者接受库存中的更新而不知道现有的给定产品 ID 是常见的做法?当我们的流(比如在均匀采购中)开始出现乱序时,这将如何工作?例如更新库存产品库存水平(从命令),然后创建库存产品(从响应产品创建事件)
    • @Matster2 最终一致性应该是毫秒级的;要更新 StockProduct Aggregate,您必须将其从持久性中水合到内存中,这意味着 StockProduct 应该存在(在您的情况下是创建事件);如果您尝试补水但还不存在,我建议重试策略并最终抛出错误,因为出现问题。好消息是,即使如此,您的系统仍然具有一致性,一旦问题得到解决,用户就可以转到 Manage Stock UI 来更新产品。
    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 2018-07-04
    • 1970-01-01
    • 2015-02-22
    • 2014-08-22
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    相关资源
    最近更新 更多