原文地址:http://www.geekabyte.io/2015/10/exploring-cqrs-with-axon-framework_12.html
在探索命令,命令总线和命令处理程序时,我们使用Axon查看了CQRS的命令处理方面。 我们创建了通过命令网关分派到命令总线的命令,然后由它们各自的命令处理程序处理。
但是在那篇文章中,所有的命令处理程序都是打印到控制台。 在现实生活中的应用程序中,您可能希望命令在应用程序中导致状态更改。 实现这一目标是我们接下来要看到的,但对于我们这样做,我们首先需要探索源自领域驱动设计世界的一些概念。 即实体,聚合,聚合根,存储库和领域事件。
在这个交汇点,值得一提的是DDD的概念和想法总是出现在典型的CQRS讨论中……这篇文章和系列中的其他内容也不例外,因此,至少对这些DDD概念的基本理解将会受益。
这篇文章将提供相关DDD概念的快速概述,而不涉及Axon Framework,而下一篇文章将介绍如何使用Axon实现它们。
话虽如此,让我们快速概述一下我们在使用Axon Framework探索CQRS时需要的相关DDD概念。
Domain Driven Design.
DDD的核心理念/目标是提供一种成功管理构建软件所涉及的固有和不可避免的复杂性的方法。
为了做到这一点,它规定了一些事情,其中之一是软件组件应尽可能地为其构建的域建模。 然后,它规定了可能有助于实现这一目标的方法和构建块。 实体,域事件,聚合,聚合根,存储库和域事件是这些组件中的一些,它们是我们要触及的,因为它们在我们对CQRS的探索中直接发挥作用。
Domain Objects
术语“域对象”并不是什么特别的技术。 它只是一个术语,指的是用于模拟正在构建软件的域的不同类型的对象。
Entity
实体是具有区别特征的对象,它们具有形成连续性线索的身份。
例如,查看此对象:
class Person {
firstName,
lastName,
age,
socialSecurityNumber
}
持有连续性线程指的是在Person对象的生命周期中,其各种属性可能会发生变化,但建立其身份的属性将始终保持不变。 一个人可能会改变他们的名字,变老等等,但他们的socialSecurityNumber会保持不变。
在DDD中,还建议实体保留业务逻辑,而不仅仅是数据包
Aggregate and Aggregate Root
Aggregate在技术上是一个“概念”,而不是一个文件,一个类,或者你可以在IDE中轻易指出的东西……它更像是一个抽象的概念,而不是一个具体的东西。
它是域对象的逻辑集合,应该形成一个原子的,有凝聚力的整体。
这种对象集合的两个特征是它们应该形成逻辑分组,并且组成对象应该保持在定义的,所需的一致状态。
一个例子是由各种物体组成的车辆:轮胎,方向盘,散热器,发动机等,但将所有这些组成物体作为一个原子整体应该始终保持一致状态是有意义的(至少是这样的) 如果他们属于同一车辆)。
这样的对象集合在DDD中被称为聚合。
另一方面,聚合根指的是这些内聚组中被指定为容器对象的对象。 聚合根确保对象的集合保持在所需的一致和内聚状态。
使用我们的车辆类比,我们可以将Car对象作为聚合根。 如果您想在轮胎上操作,则无法直接使用轮胎,但必须通过Car对象。
如果您在使用DDD设计的系统中寻找一个“聚类”,您将找不到“聚类”,您最有可能找到的是一个对象集合,其中一个对象被指定为该对象的根 对象…也就是聚合根。
在现实生活系统中,聚合根将包含许多对象,而在更简单的系统中,聚合根本身可能是所有需要存在的对象。 在这种情况下,您将聚合根作为聚合中的唯一对象
Repository
存储库也是一个对象。 域对象旨在抽象出聚合的检索和持久性。
因此,在Domain Driven Design中,您不能直接访问聚合,但是您可以通过Repository访问聚合。
Domain Events
域事件的概念源于希望在域驱动设计中在更大的系统内具有完全封装的子系统。 域事件意味着两个封装系统之间的桥梁,它们不应该彼此直接相关,但仍然需要协同工作。
因此,域事件是向外界传达信息的消息,关于聚合中发生的变化。
后记
领域驱动设计是一个非常广泛的主题。 有一本书的领域驱动设计,仅为其探索而编写。 所以这篇文章中解释的这几个概念并没有以任何方式涵盖DDD的全部深度,而是它的作用(我希望它足够好)它提供了一个基本的理解,所以当涉及到 使用Axon构建聚合根,存储库等,读者可以更好地了解正在发生的事情。
接下来的帖子将是构建实体,聚合,聚合根和存储库组件。 在帖子中,我们看到我们如何使用Axon Framework在CQRS应用程序中实际构建组件。