在 CQRS 中,如何生成正确的自动编号 ID?

In CQRS, how do you generate a correct autonumbered ID?

所以我最近阅读了一些关于 CQRS 的文章,我想知道如何为命令生成正确的自动编号标识符。如果标识符是一个 guid,您可以只执行 Guid.NewGuid() 来生成标识,但是您如何能够在自动编号的 int table 中生成一个安全的唯一新编号?我的第一个想法是,您可以 select max 在您要写入的 table 上,但是如果两个用户同时尝试写入并且都认为他们拥有下一个安全 ID 会怎样?当你去检查写入状态时,你是否让队列中的第一个写入并拒绝第二个+写入请求并实施重试模式?让我们假设重新考虑数据库设计不是一种选择。

如果您不想让数据库分配下一个 ID,则必须在域模型中的某处执行此操作。在域模型中,约束受聚合保护。在您的情况下,唯一编号是一种约束,因此您必须使用聚合来生成唯一 ID。

顺便说一句,我从来没有遇到过需要为命令生成唯一ID。命令代表业务角度的用例。如果您要求命令具有唯一的、顺序的、无间隙的 ID,基础设施要求就会泄漏到您的域中,这是明显的代码味道,表明设计决策不当。

请参阅此 post,它描述了一种方法,您可以在其中分配未使用的 ID 块和已使用的已分配 ID 以作为标识符提供。这种方法有利有弊。

http://enterprisecraftsmanship.com/2014/11/15/cqs-with-database-generated-ids/