Domain driven design CQR和同步操作(如用户注册)

Domain driven design CQR和同步操作(如用户注册),domain-driven-design,cqrs,domain-events,Domain Driven Design,Cqrs,Domain Events,我正在采用DDD概念来设计我们的下一个项目,更具体地说是CQR 在读了很多东西之后,我现在尝试实现一个简单的概念证明 问题是我刚开始就被卡住了:p 我正在尝试将此方法应用于一个简单的用户注册过程,其中包括以下步骤: 用户填写注册表并提交请求 应用程序创建用户 应用程序验证用户身份(自动登录) 应用程序向用户发送验证电子邮件 应用程序通过确认消息将用户重定向到其他地方 从实施的角度来看,到目前为止我得到的是: 控制器操作将请求数据映射到RegisterCommand对象 控制器操作要求命令总

我正在采用DDD概念来设计我们的下一个项目,更具体地说是CQR

在读了很多东西之后,我现在尝试实现一个简单的概念证明

问题是我刚开始就被卡住了:p

我正在尝试将此方法应用于一个简单的用户注册过程,其中包括以下步骤:

  • 用户填写注册表并提交请求
  • 应用程序创建用户
  • 应用程序验证用户身份(自动登录)
  • 应用程序向用户发送验证电子邮件
  • 应用程序通过确认消息将用户重定向到其他地方
从实施的角度来看,到目前为止我得到的是:

  • 控制器操作将请求数据映射到RegisterCommand对象
  • 控制器操作要求命令总线处理寄存器命令
  • 命令处理程序(UserService)“register”方法创建一个新的用户对象(无论是通过新命令还是工厂对象)
  • 该模型将引发RegisterEvent
  • 命令处理程序要求存储库存储新的用户对象
就是这样,控制器动作根本不知道这些

因此,我的猜测是,由于此上下文中的所有操作都必须同步完成(电子邮件发送除外),我可以使用直接/同步命令总线,在控制器操作中,在命令总线调用之后,我可以查询只读用户(查询数据库),如果它存在,则假设一切正常,因此,我可以给用户一个确认消息

由事件处理程序处理的自动登录进程

假设这是正确的,如果出现问题,如何向用户提供正确的信息

我们可以在互联网上找到的文章中经常用到一个常见的例子:客户使用过期的信用卡支付订单。系统接受请求,通知用户一切正常,但几分钟后用户收到一封电子邮件,告诉他他的订单无法处理

嗯,这种情况在很多情况下都是可以接受的,但在其他一些情况下,这是不可能的。那么,处理这些用例的示例在哪里呢p


谢谢大家!

人为示例的问题在于,您可以改变对“域”如何工作的看法,因此,专门讨论这个示例没有什么用处。你似乎放弃的基本前提是,我们必须假设一切都会顺利进行。其他一切都是关于风险和减轻风险的。举个例子,如果我问你,如果我在100000个用户中丢失了1个用户注册怎么办?如果我失去了十分之一呢?为什么会这样?那时候我有更大的问题吗?当系统恢复在线并按预期工作时,未来的用户可能会再次注册吗?什么时候?如果我们监控我们的服务质量,阻止用户注册,因为我们不能保证他们与我们品牌相关联的质量,会怎么样?如果服务器爆炸了,或者数据中心被炸了怎么办?我们想保护自己不受伤害吗?你看,没有正确的答案。只是各种各样的灰色。那么,我们如何降低风险呢?我们可以使事情同步,但这只是在有限的时间点上的保证。如果我必须恢复2小时前的备份(例如,因为磁盘损坏),该怎么办?这意味着2个小时的注册用户流失(可能)。这些事情发生了。。。我只是想指出我认为一种虚假的安全感的相对性。减轻风险,投资于你无法承受的损失,确保你有一个良好的审计线索。可能不是您想要的答案…

我认为这个注册用例比您想象的更接近于支付订单用例

大多数CQR思想领袖建议在发出命令之前在读取端进行验证,从而使您的命令获得更高的成功概率

如果读取端的验证失败,您知道如何处理此问题-在发送注册命令之前,让用户选择另一个名称。如果验证成功,发送命令-现在您所说的最多可能是几百微秒,在您验证命令和发送命令之间,其他用户可能会进入并使用相同的用户名。不太可能

在非常罕见的情况下,当这种情况发生时,您的行为与过期信用卡示例相同-下次用户登录时,您向他们提供说明和提交新用户名的表单-或向他们发送电子邮件,告诉他们“嘿-其他人有该用户名,请单击此处选择新用户名”。为什么这样做有效?因为您具有该用户的唯一ID

查看类似Twitter的用户注册页面。一旦您输入用户名,它就会进行一个小小的Ajax调用,并说“不,这已经完成”或“这一个很好!”这是预验证


我希望这有帮助

这些处理器是否在同一线程中运行?或者您在别处运行另一个服务来处理命令/事件?我们使用脚本语言,因此没有线程。排队服务器最终可能存在,但我认为在这个用例中是不存在的。问题是,在注册过程中,没有人希望等待服务器处理请求的用户。您不能像用户添加注释时那样,通过使用javascript立即显示其消息来伪造它。更常见的是,用户可以立即使用该服务。我们还可以想象一个3步注册过程:1。用户输入用户名/电子邮件/密码2。用户将自动登录并被邀请完成其配置文件3。用户被重定向到他的主页(无论它是提要还是其他内容),我认为这是可以的。只要您没有使用用户名作为t