CQRS/Event 采购 - 是否期望从 user/request 收到聚合 ID?
CQRS/Event Sourcing - Does one expect to receive an Aggregate Id from the user/request?
我目前只是想学习一些新的编程模式,因此我决定尝试一下事件溯源。
我决定在 shipping/inventory 的域中将一个仓库建模为我的聚合根,其中仓库的数量通常非常恒定(即公司不会经常添加仓库)。
我有运行关于如何在我的服务器上设置我的aggregateId 的问题,它应该对应于一个仓库。我见过的大多数示例,包括 this one,都显示了在创建新聚合(在我的例子中是仓库)时在服务器端生成的聚合 ID,然后在为后续引用该聚合时传入命令请求命令。
你认为这是正确的做法吗? C我希望用户在发出命令时知道并传递聚合 ID? 我意识到这可能是域相关的,也可能是一个 UI/UX 选择,只是想知道什么别人做过。如果我的事件来源聚合的数量更频繁,例如餐单或购物车,这对我来说会更有意义。
谢谢!
Would you say this is the correct approach?
你问的是 Greg Young 的事件溯源示例之一是否代表了正确的方法...鉴于 CQRS 和事件溯源的组合本质上是由 Greg 发明的(重新),我想说有一个非常好的方法有机会。
一般来说,让实现命令端的代码为它需要编写的每个命令、事件或其他持久对象生成一个 GUID 是迄今为止最简单的实现,因为 G UID 保证是唯一的。在分布式系统中,没有协调的唯一性是一件大事。
Can I expect the user to know and pass aggregate Ids when issuing commands?
不,你尤其不能指望用户知道他们资产的 GUID。您可以做的是向用户展示他或她的资产列表。列表中的每个项目都将关联 GUID,但可能没有必要在用户界面中显示该 ID。它只是底层 UI 对象在内部携带的数据。
在某些情况下,用户确实需要知道他们的某些资产的 ID(例如,如果它涉及 phone 支持)。在这种情况下,您可以 add a lookup API to address that concern.
Heuristic:聚合id,在很多情况下,类似于数据库中用于区分实体的主键table。 natural 与 surrogate 键的许多教训都适用。
Can I expect the user to know and pass aggregate Ids when issuing commands?
您可能不能依赖 人类 来了解聚合 ID。但是人工操作员使用的客户端可以很好地了解它们。
例如,如果操作员将在会话期间在单个仓库中工作,那么我们可能会查找适当的标识符,缓存它,并在代表用户构建消息时使用它。
模拟:当您填写并提交 Web 表单时,浏览器 会执行查看表单操作并使用该信息构建正确 URI 的工作,并且同样正确的 HTTP 请求。
客户端通常会知道 ID 是什么,因为它是在之前的查询中刚刚获得的。
创作 模式很奇怪。在某些情况下,客户端选择在创建新聚合时要使用的标识符是有意义的。在其他情况下,客户端为命令消息提供标识符是有意义的,服务器自行决定聚合标识符应该是什么。
它是消息传递,因此您要小心地将客户端直接耦合到您的内部实现细节——尤其是当该客户端处于不同的开发计划中时。如果你把消息契约弄对了,那么服务端和客户端可以随时按照契约以任何方式进化。
您可能想回顾 Greg Young 的 10 年回顾,其中包括对 warehouse systems 的讨论。 TL;DR - 在许多情况下,来自人工操作员的消息是 事件 ,而不是命令。
我目前只是想学习一些新的编程模式,因此我决定尝试一下事件溯源。
我决定在 shipping/inventory 的域中将一个仓库建模为我的聚合根,其中仓库的数量通常非常恒定(即公司不会经常添加仓库)。
我有运行关于如何在我的服务器上设置我的aggregateId 的问题,它应该对应于一个仓库。我见过的大多数示例,包括 this one,都显示了在创建新聚合(在我的例子中是仓库)时在服务器端生成的聚合 ID,然后在为后续引用该聚合时传入命令请求命令。
你认为这是正确的做法吗? C我希望用户在发出命令时知道并传递聚合 ID? 我意识到这可能是域相关的,也可能是一个 UI/UX 选择,只是想知道什么别人做过。如果我的事件来源聚合的数量更频繁,例如餐单或购物车,这对我来说会更有意义。
谢谢!
Would you say this is the correct approach?
你问的是 Greg Young 的事件溯源示例之一是否代表了正确的方法...鉴于 CQRS 和事件溯源的组合本质上是由 Greg 发明的(重新),我想说有一个非常好的方法有机会。
一般来说,让实现命令端的代码为它需要编写的每个命令、事件或其他持久对象生成一个 GUID 是迄今为止最简单的实现,因为 G UID 保证是唯一的。在分布式系统中,没有协调的唯一性是一件大事。
Can I expect the user to know and pass aggregate Ids when issuing commands?
不,你尤其不能指望用户知道他们资产的 GUID。您可以做的是向用户展示他或她的资产列表。列表中的每个项目都将关联 GUID,但可能没有必要在用户界面中显示该 ID。它只是底层 UI 对象在内部携带的数据。
在某些情况下,用户确实需要知道他们的某些资产的 ID(例如,如果它涉及 phone 支持)。在这种情况下,您可以 add a lookup API to address that concern.
Heuristic:聚合id,在很多情况下,类似于数据库中用于区分实体的主键table。 natural 与 surrogate 键的许多教训都适用。
Can I expect the user to know and pass aggregate Ids when issuing commands?
您可能不能依赖 人类 来了解聚合 ID。但是人工操作员使用的客户端可以很好地了解它们。
例如,如果操作员将在会话期间在单个仓库中工作,那么我们可能会查找适当的标识符,缓存它,并在代表用户构建消息时使用它。
模拟:当您填写并提交 Web 表单时,浏览器 会执行查看表单操作并使用该信息构建正确 URI 的工作,并且同样正确的 HTTP 请求。
客户端通常会知道 ID 是什么,因为它是在之前的查询中刚刚获得的。
创作 模式很奇怪。在某些情况下,客户端选择在创建新聚合时要使用的标识符是有意义的。在其他情况下,客户端为命令消息提供标识符是有意义的,服务器自行决定聚合标识符应该是什么。
它是消息传递,因此您要小心地将客户端直接耦合到您的内部实现细节——尤其是当该客户端处于不同的开发计划中时。如果你把消息契约弄对了,那么服务端和客户端可以随时按照契约以任何方式进化。
您可能想回顾 Greg Young 的 10 年回顾,其中包括对 warehouse systems 的讨论。 TL;DR - 在许多情况下,来自人工操作员的消息是 事件 ,而不是命令。