所以我最近在CQRS上阅读了一些内容,我想知道如何为命令生成正确的自动编号标识符。如果indentifer是guid,你可以只使用Guid.NewGuid()来生成标识,但是如何在自动编号的int表中生成一个安全唯一的新数字呢?我的第一个想法是你可以在你正在写的表上选择max,但是如果两个用户同时尝试写入并且认为他们有下一个安全ID会发生什么?您是否让队列中的第一个写入并拒绝第二个+写入请求并在您检查写入状态时实施重试模式?我们假设重新考虑数据库设计不是一种选择。
答案 0 :(得分:2)
如果您不想让数据库分配下一个ID,您必须在域模型中的某个位置执行此操作。在域模型中,约束受聚合保护。在您的情况下,唯一编号是一种约束,因此您必须使用聚合来生成唯一ID。
顺便说一句,我从未遇到过为命令生成唯一ID的需要。命令表示业务角度的用例。如果您需要命令具有唯一的,顺序的,无间隙的ID,则基础结构要求会泄漏到您的域中,这清晰的代码味道表明设计决策不佳。
答案 1 :(得分:0)
请参阅此文章,其中介绍了一种方法,您可以在其中分配未使用的ID块,并使用已分配的ID作为标识符提供。该方法有利有弊。
http://enterprisecraftsmanship.com/2014/11/15/cqs-with-database-generated-ids/