8

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

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

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

我正在尝试将此方法应用于简单的用户注册过程,其中步骤是:

  • 用户填写注册表并提交请求
  • 应用程序创建用户
  • 该应用程序对用户进行身份验证(自动登录)
  • 应用程序向用户发送验证电子邮件
  • 该应用程序使用确认消息将用户重定向到其他地方

从实现的角度来看,到目前为止我得到的是:

  • 控制器操作将请求数据映射到 RegisterCommand 对象
  • 控制器动作要求命令总线处理 RegisterCommand
  • 命令处理程序(UserService)“注册”方法创建一个新的用户对象(无论是通过新命令还是工厂对象)
  • 模型引发 RegisterEvent
  • 命令处理程序要求存储库存储新的用户对象

就是这样,控制器操作对此一无所知。

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

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

假设这是正确的,如果出现问题怎么办,如何以正确的信息通知用户?

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

好吧,这种情况在许多情况下是可以接受的,但对于其他一些情况,这是不可能的。那么处理这些用例的例子在哪里呢?:p

谢谢 !

4

2 回答 2

4

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

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

如果读取端的验证失败,您知道如何处理 - 在您发送注册命令之前让用户选择另一个名称。如果验证成功,发送命令——现在你说的最多可能有几百微秒,在你验证命令和发送命令之间,另一个用户可能已经进来并使用相同的用户名。不大可能。

在极少数情况下,当这种情况发生时,您的行为方式与过期信用卡示例相同 - 下次用户登录时,您向他们提供解释和提交新用户名的表格 - 或发送他们收到一封电子邮件,上面写着“嘿-其他人有该用户名,请单击此处选择一个新用户名”。为什么这行得通?因为您有该用户的唯一 ID。

查看像 Twitter 这样的用户注册页面。一旦你输入一个用户名,它就会做一个小小的 Ajax 调用并说“不,这是被占用”或“这个很好!” 那是预验证。

我希望这有帮助!

于 2013-05-04T03:36:56.280 回答
1

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

于 2013-05-01T21:27:01.760 回答