基于Mauro Servienti题为" All Our Aggregates are Wrong "的演讲。这里是供参考的链接:https://www.youtube.com/watch?v=KkzvQSuYd5I
我们可能有几个有界上下文,每个上下文都包含一个项目的信息。
如
- 营销背景—名称、描述、图片
- 销售环境-标价,产品代码?
- 库存-库存水平
每个上下文都可以有自己的名称,例如,inventory可以将其称为sales item。
我认为sales可能是一个项目的所有者,所以当你去创建一个项目时,这是它将被创建的地方。
我有两个问题
UI分别调用这些上下文吗?
如果我有一个UI来创建一个产品/项目,并获取营销和销售数据(清单价格,产品代码,名称,描述),我相信UI将进行两个单独的调用。
第一个调用是对销售上下文的调用,以创建项目,它将发布一个ItemCreated事件或类似事件。第二次调用将是对营销上下文的调用,以设置名称、描述等…
正确吗?
<营销的项目/strong>因此,我对库存服务的理解是,它将监听sales ItemCreated事件,然后为其表示的项目(inventory item)创建自己的聚合/流
另一方面,如果我有一个UI,我在其中创建了带有sales的项目,然后需要在marketing中设置数据,那么UI是否等待在marketing中创建了项目,然后才设置标题和描述?UI是否轮询营销上下文,直到条目创建完成,然后执行命令更新数据?
我以前也做过类似的事情。
我发现最好的方法是:
首先,您必须找到该项目的主要所有者。对我来说,它是一个产品目录。
在目录中有产品意味着公司打算使用该产品,即使没有库存,也没有营销活动,也没有任何东西。这是一个自身的聚合,它的操作(将产品添加到目录)完全是事务性的,因为即使事件ProductAddedToCatalog在其他有界上下文(BC)中应用失败(因为基础设施失败),我也不必撤消或协调/编排任何东西。请重试引发事件。目录BC保持在一致状态。
对于其他BC;应用事件意味着它们创建带有空值/默认值的条目。例如,在仓库BC中,条目是用0库存及其相关产品目录ID创建的。在市场营销中,条目是作为产品创建的,到目前为止还没有营销活动。等与其他BC。
我是如何为这个建模UI的?我像向导一样创建了几个屏幕。
第一个屏幕询问产品目录信息。它唯一的任务是在目录中插入一个新产品。
下一个屏幕要求仓库信息,但它没有插入;它正在使用在第一步中引发的ProductAddedToCatalog事件创建的默认值更新条目。
这样,在仓库步骤失败的情况下,系统保持其一致的状态,用户可以使用UI任务更新仓库BC中的产品库存。