2

想象一个实例,其中我们有一个具有值对象集合的实体。

如果我们要向集合添加(例如域概念是分配)一个额外的记录值对象,我们将有如下内容:

entity.assign_record(...)

这将引发:

class RecordAssignedEvent(...)

直线前进。

现在想象一下不变量要求需要替换整个集合的情况。假设现在分配方法将替换实体中的所有当前记录。

IE。

entity.assign_records(list <records>)

引发单个事件会更好:

class RecordsAssignedEvent:
    contains details of all records updated

或为每个分配的记录创建一个单独的事件,然后一起发布集合:

class RecordAssignedEvent(...)

我的担忧是:

  • 单个 RecordsAssignedEvent 将包含大量数据...想象一下分配了 10 条记录?100?
  • 我的领域事件仅包含原始类型。但是,如果我作为单个事件提出,我将被迫创建一些 DTO 或类似的东西以包含为一个集合。该 DTO 现在需要对事件的任何订阅者可用。如果我引发多个事件,我可以轻松地继续限制为原语。

在 DDDSample 应用程序中,有一个类似的场景,其中 Cargo 的行程由多个支路组成(在这种情况下,集合本身是由值对象组成的值对象):

https://github.com/citerus/dddsample-core/blob/master/src/main/java/se/citerus/dddsample/domain/model/cargo/Cargo.java

在这些情况下,是否有关于领域事件粒度的任何指导?

4

1 回答 1

4

在这些情况下,是否有关于领域事件粒度的任何指导?

如果您正在寻找有关领域事件的指导,event-sourcing这是一个很好的搜索词:将他们的领域状态存储在事件流中的人花费大量时间担心诸如粒度之类的事情。

从广义上讲,与单个事务相关联的多个域事件是常见的。换句话说,当该模型比单个事件更适合您的域时,您应该毫不犹豫地考虑多个域事件。

一个经常讨论的例子是“交易手册”,我们在其中匹配买卖订单。单个大卖单可能会关闭几个不同的买单,并且为每个关闭的订单触发不同的事件是与域语言的自然契合。

在复杂的过程中,能够回溯事件图通常很有用;C 是由 B 引起的,也是由 A 引起的。如果我们不必在 B 中四处挖掘试图找出 B 的哪个部分是 C 的原因,那么执行分析的工作可能会简单得多。

我们源代码中的许多凝聚力的相同动机也适用于事件设计。

也就是说,您通常需要多个领域事件的领域原因,而不是机械原因。如果大的、不方便的信息图序列化真的是你的领域语言中的一个单一的原子变化,那么你真的应该为它设计适当的模式,而不是走捷径,沿着任意边界雕刻信息,所以数据将与您的任意模式约定保持一致。

又名“这取决于”。

于 2020-04-11T02:55:21.247 回答