domain-driven-design - UserRegisteredEvent 与 RegisteredUserEvent 命名
问题描述
我们开始在我的公司中使用领域驱动设计,我想知道如何命名事件。
我在犹豫:
UserRegisteredEvent
:因为它是“用户注册”的过去式RegisteredUserEvent
: 因为形容词在英语中应该排在第一位
UserRegisteredEvent
从我在互联网上可以找到的似乎是正确的。
但我想知道主题是否不是像使用 TextMessage 那样执行操作的主题:
- 已发送 TextMessage =>
SentTextMessageEvent
- 用户发送 TextMessages =>
UserSentTextMessageEvent
(有点冗长,我们并不关心它是由用户完成的) - 一个 TextMessage 不发送自己=>
TextMessageSentEvent
=> 这方面的最佳实践是什么?=> 我应该区分UserRegisteredEvent
(用户注册自己)和RegisteredUserEvent
(某人注册新用户)吗?
谢谢!
解决方案
当与业务利益相关者密切合作时——这是利用领域驱动设计的主要支柱之一——命名部分在大多数情况下非常明显。业务人员确实已经知道如何命名系统的哪个部分发生了什么。
系统的哪一部分将为您提供相关实体(或对象)的名称,而发生的事情将为您提供过去时态的动词。
当在源代码中命名域事件时,我们会提供一些可读的事件摘要,这使得它可以从业务角度快速识别为相应的事件。
您在问题中查看了两种不同的命名模式:
- 模式 A : 过去时动词在开头
- <过去时动词描述发生了什么><感兴趣的实体名称>
- 注册用户
- 已发送文本消息
- 已发货订单
- 已交付包裹
- 模式 B : 动词的过去式
- <感兴趣的实体名称><过去时动词描述发生了什么>
- 用户注册
- 文本消息发送
- 订单出货
- 包裹已送达
附加...Event后缀(例如UserRegisteredEvent)当然是有效的,并且附加或不附加后缀几乎总是根据我一直与之合作的团队的偏好来决定。
在谈论域事件时,您还必须考虑域命令。对于域命令,您还可以添加...Command后缀。该命令表示一个命令,告诉您要做什么,其中涉及一些实体(或对象)和一些以命令式形式描述的动词。
例如:
- 发货单
- 注册用户
- 发送文本消息
因此,让我们再次以您的问题中的以下事件名称为例,使用以过去时动词开头的模式(模式 A):
RegisteredUserEvent:因为形容词在英语中应该排在第一位
已发送 TextMessage => SentTextMessageEvent
在所有情况下,当我应用领域驱动设计时,我们都同意使用过去时动词在末尾的另一个模式(模式 B),原因如下:
事件的名称应该可以快速识别并且——这对我来说也很重要——即使不使用...Event和...Command后缀也可以与命令区分开来。
当我查看以下使用模式 A的命令和事件示例时,作为一名读者,我很难过:
- SentTextMessage(事件)与SendTextMessage(命令)
- RegisteredUser(事件)与RegisterUser(命令)
但是,当我使用另一种形式的事件命名(模式 B)时,对于所有相关人员来说,无论是在图纸、书面架构文档、源代码等方面,都会变得容易得多,例如:
- TextMessageSent(事件)与SendTextMessage(命令)
- UserRegistered(事件)与RegisterUser(命令)
推荐阅读
- android - xamarin android版本9中的Telerik Radcalendarview内联事件点击问题
- powershell - PowerShell - 列出 TreeView GUI 元素中的所有文件夹和子文件夹
- javascript - 如何更改仅带有弹出窗口的活动选项卡的 Chrome 扩展程序图标?
- angular - Angular - 输入在 Enter 按下时被删除,因为调用“删除”功能,而不是预期的焦点
- python - 如何使带有 Oauth 的 python 命令行工具在 lambda 中工作?
- python-3.x - Python3 理解列表赋值(浅/深拷贝或参考)
- amazon-s3 - 带有ansible的重定向规则S3
- powershell - 如何在 powershell 命令上设置超时?
- ios - getDocuments() 函数多次获取相同的数据
- visual-studio - 如何使扩展菜单图标适应 Visual Studio 主题?