Domain driven design CQR和同步操作(如用户注册)
我正在采用DDD概念来设计我们的下一个项目,更具体地说是CQR 在读了很多东西之后,我现在尝试实现一个简单的概念证明 问题是我刚开始就被卡住了:p 我正在尝试将此方法应用于一个简单的用户注册过程,其中包括以下步骤:Domain driven design CQR和同步操作(如用户注册),domain-driven-design,cqrs,domain-events,Domain Driven Design,Cqrs,Domain Events,我正在采用DDD概念来设计我们的下一个项目,更具体地说是CQR 在读了很多东西之后,我现在尝试实现一个简单的概念证明 问题是我刚开始就被卡住了:p 我正在尝试将此方法应用于一个简单的用户注册过程,其中包括以下步骤: 用户填写注册表并提交请求 应用程序创建用户 应用程序验证用户身份(自动登录) 应用程序向用户发送验证电子邮件 应用程序通过确认消息将用户重定向到其他地方 从实施的角度来看,到目前为止我得到的是: 控制器操作将请求数据映射到RegisterCommand对象 控制器操作要求命令总
- 用户填写注册表并提交请求
- 应用程序创建用户
- 应用程序验证用户身份(自动登录)
- 应用程序向用户发送验证电子邮件
- 应用程序通过确认消息将用户重定向到其他地方
- 控制器操作将请求数据映射到RegisterCommand对象
- 控制器操作要求命令总线处理寄存器命令
- 命令处理程序(UserService)“register”方法创建一个新的用户对象(无论是通过新命令还是工厂对象)
- 该模型将引发RegisterEvent
- 命令处理程序要求存储库存储新的用户对象
谢谢大家! 人为示例的问题在于,您可以改变对“域”如何工作的看法,因此,专门讨论这个示例没有什么用处。你似乎放弃的基本前提是,我们必须假设一切都会顺利进行。其他一切都是关于风险和减轻风险的。举个例子,如果我问你,如果我在100000个用户中丢失了1个用户注册怎么办?如果我失去了十分之一呢?为什么会这样?那时候我有更大的问题吗?当系统恢复在线并按预期工作时,未来的用户可能会再次注册吗?什么时候?如果我们监控我们的服务质量,阻止用户注册,因为我们不能保证他们与我们品牌相关联的质量,会怎么样?如果服务器爆炸了,或者数据中心被炸了怎么办?我们想保护自己不受伤害吗?你看,没有正确的答案。只是各种各样的灰色。那么,我们如何降低风险呢?我们可以使事情同步,但这只是在有限的时间点上的保证。如果我必须恢复2小时前的备份(例如,因为磁盘损坏),该怎么办?这意味着2个小时的注册用户流失(可能)。这些事情发生了。。。我只是想指出我认为一种虚假的安全感的相对性。减轻风险,投资于你无法承受的损失,确保你有一个良好的审计线索。可能不是您想要的答案…我认为这个注册用例比您想象的更接近于支付订单用例 大多数CQR思想领袖建议在发出命令之前在读取端进行验证,从而使您的命令获得更高的成功概率 如果读取端的验证失败,您知道如何处理此问题-在发送注册命令之前,让用户选择另一个名称。如果验证成功,发送命令-现在您所说的最多可能是几百微秒,在您验证命令和发送命令之间,其他用户可能会进入并使用相同的用户名。不太可能 在非常罕见的情况下,当这种情况发生时,您的行为与过期信用卡示例相同-下次用户登录时,您向他们提供说明和提交新用户名的表单-或向他们发送电子邮件,告诉他们“嘿-其他人有该用户名,请单击此处选择新用户名”。为什么这样做有效?因为您具有该用户的唯一ID 查看类似Twitter的用户注册页面。一旦您输入用户名,它就会进行一个小小的Ajax调用,并说“不,这已经完成”或“这一个很好!”这是预验证
我希望这有帮助 这些处理器是否在同一线程中运行?或者您在别处运行另一个服务来处理命令/事件?我们使用脚本语言,因此没有线程。排队服务器最终可能存在,但我认为在这个用例中是不存在的。问题是,在注册过程中,没有人希望等待服务器处理请求的用户。您不能像用户添加注释时那样,通过使用javascript立即显示其消息来伪造它。更常见的是,用户可以立即使用该服务。我们还可以想象一个3步注册过程:1。用户输入用户名/电子邮件/密码2。用户将自动登录并被邀请完成其配置文件3。用户被重定向到他的主页(无论它是提要还是其他内容),我认为这是可以的。只要您没有使用用户名作为t