Domain driven design CQRS/事件来源-是否希望从用户/请求接收聚合Id?

Domain driven design CQRS/事件来源-是否希望从用户/请求接收聚合Id?,domain-driven-design,cqrs,event-sourcing,aggregateroot,Domain Driven Design,Cqrs,Event Sourcing,Aggregateroot,我目前正在尝试学习一些新的编程模式,我决定尝试一下事件源 我已决定将仓库建模为装运/库存领域中的聚合根,其中仓库数量通常相当恒定,即公司不会太频繁地添加仓库 我遇到了如何在服务器上设置aggregateId的问题,aggregateId应该对应于仓库。我看到的大多数示例(包括)都显示了在创建新聚合(在我的示例中为仓库)时,在服务器端生成聚合ID,然后在为后续命令引用该聚合时传入命令请求 你认为这是正确的方法吗?我可以期望用户在发出命令时知道并传递聚合ID吗?我意识到这可能与域有关,也可能是UI/

我目前正在尝试学习一些新的编程模式,我决定尝试一下事件源

我已决定将仓库建模为装运/库存领域中的聚合根,其中仓库数量通常相当恒定,即公司不会太频繁地添加仓库

我遇到了如何在服务器上设置aggregateId的问题,aggregateId应该对应于仓库。我看到的大多数示例(包括)都显示了在创建新聚合(在我的示例中为仓库)时,在服务器端生成聚合ID,然后在为后续命令引用该聚合时传入命令请求

你认为这是正确的方法吗?我可以期望用户在发出命令时知道并传递聚合ID吗?我意识到这可能与域有关,也可能是UI/UX的选择,只是想知道其他人做了什么。如果我的活动来源聚合的数量更频繁,比如使用餐券或购物车,这对我来说更有意义

谢谢

你认为这是正确的方法吗

你在问Greg Young的事件来源示例是否代表了正确的方法。。。鉴于CQR和活动采购的结合基本上是由Greg重新发明的,我认为这是一个很好的机会

一般来说,让实现命令端的代码为它需要编写的每个命令、事件或其他持久对象生成GUID是迄今为止最简单的实现,因为GUID保证是唯一的。在分布式系统中,没有协调的唯一性是一件大事

我可以期望用户在发出命令时知道并传递聚合ID吗

不,而且您尤其不能期望用户知道其资产的GUID。您可以做的是向用户提供他或她的资产列表。列表中的每个项都将关联GUID,但可能不需要在用户界面中显示该ID。它只是底层UI对象内部携带的数据


在某些情况下,用户确实需要知道其某些资产的ID,例如,如果涉及电话支持。在这种情况下,您可以。

启发式:在许多情况下,聚合id类似于用于区分数据库表中实体的主键。自然关键点与代理关键点的许多经验教训都适用

我可以期望用户在发出命令时知道并传递聚合ID吗

您可能无法依靠人来了解聚合ID。但是人工操作员使用的客户机可以非常了解它们

例如,如果操作员在会话期间在单个仓库中工作,那么我们可能会查找适当的标识符,缓存它,并在代表用户构造消息时使用它

模拟:当您填写web表单并提交表单时,浏览器会查看表单操作,并使用该信息构造正确的URI,以及类似的正确HTTP请求

客户机通常会知道ID是什么,因为它是在上一次查询中得到的

创造模式很奇怪。在某些情况下,客户端在创建新聚合时选择要使用的标识符是有意义的。在其他情况下,客户机为命令消息提供标识符是有意义的,而服务器自己决定聚合标识符应该是什么

它是消息传递,所以您要小心将客户机直接耦合到您的内部实现细节,特别是如果该客户机处于不同的开发计划中。如果您获得了正确的消息契约,那么服务器和客户机可以在任何时候以与契约一致的任何方式发展


您可能想回顾一下Greg Young的10年回顾,其中包括对以下内容的讨论。TL;DR-在许多情况下,来自操作员的消息是事件,而不是命令。

感谢视频!信息量很大。我希望他能多谈一点仓库领域,不过这只是一个简短的介绍。不过还是有帮助的。