DDD:具有值对象集合的实体 - 一个事件还是多个?
DDD: Entity with collection of value objects - One event or multiple?
想象一个实例,我们有一个实体,其中包含一组值对象。
如果我们要向集合中添加(假设域概念是指派)一个额外的记录值对象,我们将得到如下内容:
entity.assign_record(...)
这会引发:
class RecordAssignedEvent(...)
直截了当。
现在想象一种情况,其中不变量需要替换整个集合。假设一个赋值方法现在将替换实体中的所有当前记录。
即
entity.assign_records(list <records>)
单挑会不会更好:
class RecordsAssignedEvent:
contains details of all records updated
或为每个分配的记录创建一个单独的事件,然后一起发布集合:
class RecordAssignedEvent(...)
我的顾虑是:
- 单个 RecordsAssignedEvent 将包含大量数据...想象一下要分配 10 条记录? 100?
- 我的域事件只包含原始类型。但是,如果我作为单个事件提出,我将被迫创建一些 DTO 或类似的东西以包含在一个集合中。该 DTO 现在需要对事件的任何订阅者可用。如果我引发多个事件,我可以轻松地继续限制为原语。
在 DDDSample 应用程序中有一个类似的场景,其中 Cargo 的行程由多条航段组成(在这种情况下,集合本身是由值对象组成的值对象):
在这些情况下是否有关于领域事件粒度的指导?
Is there any guidance in these situations on the granularity of domain events?
如果您正在寻找有关域事件的指导,event-sourcing
是一个很好的搜索词:将域状态存储在事件流中的人会花很多时间担心诸如粒度之类的事情。
从广义上讲,将多个域事件与单个事务相关联是 常见的 。换句话说,当该模型比单个事件更适合您的领域时,您应该毫不犹豫地考虑多个领域事件。
一个经常讨论的例子是 "trade book",我们在其中匹配买卖订单。一个大的卖单可能会关闭几个不同的买单,并且很自然地符合领域的语言,即为每个关闭的订单触发不同的事件。
在复杂的过程中,能够回溯事件图通常很有用; C 是由 B 引起的,而 B 是由 A 引起的。如果我们不必在 B 中四处挖掘以找出 B 的 部分 是哪个,那么执行分析的工作可能会简单得多C的原因
我们源代码中的许多相同的凝聚力动机也适用于事件设计。
也就是说,对于多个域事件,您通常需要 域原因,而不是机械原因。如果大的、不方便序列化的信息图真的是你领域语言中的单个原子变化,那么你真的应该为它设计合适的模式,而不是采取沿着任意边界雕刻信息的捷径,所以数据将符合您的任意模式约定。
又名 "It depends"。
想象一个实例,我们有一个实体,其中包含一组值对象。
如果我们要向集合中添加(假设域概念是指派)一个额外的记录值对象,我们将得到如下内容:
entity.assign_record(...)
这会引发:
class RecordAssignedEvent(...)
直截了当。
现在想象一种情况,其中不变量需要替换整个集合。假设一个赋值方法现在将替换实体中的所有当前记录。
即
entity.assign_records(list <records>)
单挑会不会更好:
class RecordsAssignedEvent:
contains details of all records updated
或为每个分配的记录创建一个单独的事件,然后一起发布集合:
class RecordAssignedEvent(...)
我的顾虑是:
- 单个 RecordsAssignedEvent 将包含大量数据...想象一下要分配 10 条记录? 100?
- 我的域事件只包含原始类型。但是,如果我作为单个事件提出,我将被迫创建一些 DTO 或类似的东西以包含在一个集合中。该 DTO 现在需要对事件的任何订阅者可用。如果我引发多个事件,我可以轻松地继续限制为原语。
在 DDDSample 应用程序中有一个类似的场景,其中 Cargo 的行程由多条航段组成(在这种情况下,集合本身是由值对象组成的值对象):
在这些情况下是否有关于领域事件粒度的指导?
Is there any guidance in these situations on the granularity of domain events?
如果您正在寻找有关域事件的指导,event-sourcing
是一个很好的搜索词:将域状态存储在事件流中的人会花很多时间担心诸如粒度之类的事情。
从广义上讲,将多个域事件与单个事务相关联是 常见的 。换句话说,当该模型比单个事件更适合您的领域时,您应该毫不犹豫地考虑多个领域事件。
一个经常讨论的例子是 "trade book",我们在其中匹配买卖订单。一个大的卖单可能会关闭几个不同的买单,并且很自然地符合领域的语言,即为每个关闭的订单触发不同的事件。
在复杂的过程中,能够回溯事件图通常很有用; C 是由 B 引起的,而 B 是由 A 引起的。如果我们不必在 B 中四处挖掘以找出 B 的 部分 是哪个,那么执行分析的工作可能会简单得多C的原因
我们源代码中的许多相同的凝聚力动机也适用于事件设计。
也就是说,对于多个域事件,您通常需要 域原因,而不是机械原因。如果大的、不方便序列化的信息图真的是你领域语言中的单个原子变化,那么你真的应该为它设计合适的模式,而不是采取沿着任意边界雕刻信息的捷径,所以数据将符合您的任意模式约定。
又名 "It depends"。