Skip to content

Latest commit

 

History

History
19 lines (9 loc) · 2.5 KB

cn_2.4_domain_events.md

File metadata and controls

19 lines (9 loc) · 2.5 KB

领域事件 Domain Events

领域专家所关注的已经发生的事情。

实体负责跟踪自身的状态,并具有管理自身生命周期的规则。但是,如果想知道状态变化背后的具体原因,通过实体就无法直接做到了,也就是说,很难解释系统的状态是如何变成现在的样子的。审计追踪功能可以用于跟踪操作轨迹,但通常不用于跟踪程序逻辑本身的执行过程。通过实体的变更历史可以查看实体过去的状态,但无法了解这些变更的背后的含义。因此,对实体信息的操作都只隐含在程序运行的过程中,而在领域层的领域对象中则没有体现。

对于分布式系统来说,还有一些特有的问题,这些问题和上述问题是相关的。在分布式系统中,无法在每个时刻都保持状态的完全一致。在每个时刻,聚合都能保持内在的一致性,而其他变更则是异步的。由于变更会在网络的各节点间散播开来,因此如果变更的顺序被打乱了,或者这些变更发起自不同的来源,那么就很难处理了。

因此:

将领域中关于活动的信息建模为一系列离散的事件,把每个事件表示为一个领域对象。领域事件与系统事件是不同的,尽管系统事件常常与领域事件相关。系统事件反映的是软件自身的内部活动,它们可以参与对领域事件的响应,或者将领域事件的信息传递给系统。

领域事件是领域模型中正式的组成部分,代表了领域中已经发生的事情。对于领域专家想要跟踪或被通知的事件,或其他模型对象的状态变化所引发的事件,应通过领域事件显式地表达出来,而其他不相干的领域活动则不是领域事件。

在分布式系统中,对于某个节点,可以从该节点当前已知的领域事件中推断出实体的状态,从而在缺乏系统整体信息的情况下得到一致的模型。

领域事件是对已经发生的既定事实的记录,因此通常是不可变的。除了对事件的描述以外,领域事件通常还包含表示发生时间的时间戳,以及涉及到的那些实体的标识。此外,领域事件通常还包含将事件录入系统的时间戳以及操作人员的标识。一种有用的做法是,基于上述属性的某种组合来构建领域事件的标识。这样,比如说,如果一个事件的两个实例到达了同一节点,系统就可以识别出它们是同一个事件。