使用CQRS和事件源时的唯一性验证

Tom*_*son 19 validation domain-driven-design cqrs

我正在尝试使用Event Sourcing实现我自己的CQRS基础架构,以便更好地学习它.作为一个示例项目,我正在实现一个博客引擎,我知道它可能不是一个完美的契合,但我只想做一些真实的事情.

我现在遇到的问题是验证.每个帖子都有一个shortUrl,并且shortUrl应该是唯一的,但是我应该在哪里将此验证放在域中?我知道在我通过读取读取存储来发送命令之前我将进行验证,以便在创建create post命令或更新post命令时检查它是否有效.

我可以想到两个"解决方案".

  1. 有一个Blog聚合,可以跟踪所有与博客相关的设置,也可以引用所有帖子.但在我看来,这个问题是我必须在那个场景中处理聚合之间的通信,以及每次我需要验证shortUrl我需要从事件存储中读取所有事件以创建所有帖子的唯一性时这似乎很复杂.
  2. 我有的第二个选择是当事件被触发时,我创建读取模型的事件处理程序会在发现它有两个指向不同帖子的短网址时触发重复的短网址事件.读取模型在检测到错误时触发事件是否有效?

还有其他选择吗?请注意,我知道我的域名可能不适合cqrs和DDD,但我这样做是为了在小域中学习.

Rya*_*anR 0

这取决于“企业”想要发生什么。如果您希望客户端(命令的创建者)负责选择短 URL,它应该有一个读取存储来验证它的唯一性。当用户输入短 URL 时,视图应检查短 URL 是否唯一,如果不是,则显示验证错误。每当保存帖子时,事件都会发布更新的信息(包括短 URL),从而使阅读存储保持同步。

  • 这就是我的意思“我知道在发送命令之前我会通过从我的阅读存储中读取命令来检查它在创建创建后命令或更新后命令时是否有效”。但当涉及到域时,并不能保证它仍然是唯一的。在创建博客文章时这种情况不太可能发生,但我认为这是一个有趣的场景,我仍然需要弄清楚在使用 CQRS 时如何解决。我的意思是如何处理域中的检查? (2认同)