导入
命令
了解命令的概念,学习命令的类型,并理解它们如何改变系统状态。
让我们设想一个场景:在某个限界上下文中,客户想要执行某个操作,例如购买商品、转账或观看影片。
...
在限界上下文中执行命令
在这种情况下,系统会接收到请求并执行所要求的操作。该操作的执行可能成功,也可能失败。当执行成功时,系统的状态将发生改变。
什么是命令?
命令是领域中可能发生的三类操作中的第一种,广泛应用于一种称为**命令查询职责分离(CQRS)**的设计模式中。命令代表由参与者发起的操作请求。当参与者请求执行某项操作时,该操作并不会立即执行,而是在未来某个时刻执行,并且可能成功也可能失败。
命令的类型
通常我们会构建面向 CRUD(创建、读取、更新、删除)的操作系统。
而对于命令而言,它们关注的是 CUD,即仅包含创建、更新和删除这三种会改变系统状态的操作。
这些操作都会导致系统状态发生变化。下面我们通过一个用户注册的例子来说明系统状态的变化过程:
- 初始状态下,系统中没有任何已注册的用户:
...
系统初始状态
- 一位名叫DDD、年龄为23岁的用户希望注册账号。此时系统执行一条创建命令。命令执行成功后,在数据库中新增了一条记录。这就是系统状态的变更——本质上是对系统某部分数据的修改。在此例中,系统通过向数据库添加新记录而发生了变化。
...
创建命令
- 一年后,用户DDD希望更新自己的年龄信息,于是发起一条更新命令。与创建命令类似,该命令也成功执行,从而再次改变了系统状态——此次是数据库中已有记录的修改。
...
更新命令
- 最终,用户DDD决定注销账户,因此触发一条删除命令。该命令同样成功执行,系统状态随之再次改变——数据库中的对应记录被移除。
...
删除命令
命令与通用语言
当一条命令被发送到特定的目标组件(例如转账微服务或支付微服务)时,其处理器(handler)应具有清晰明确的命名。处理器名称应当准确表达该命令的意图,例如是否用于转账、支付账单、创建订单等。需要注意的是,根据领域驱动设计中的通用语言原则,模型中定义的命令名称必须直接反映在代码实现中。以下是一些命令处理器在代码中的命名示例:
- 转账:处理器名称应为
transferMoney()。 - 支付账单:处理器名称应为
payBill()。 - 创建订单:处理器名称应为
createOrder()。
通过这种方式,通用语言与实际代码实现了统一。
...
命令与通用语言
小结
命令表示参与者在限界上下文中希望执行的操作。在限界上下文中,我们可以创建、更新或删除某些内容。
此外,系统的实现必须体现该限界上下文中所定义的通用语言。