Domain driven design Axon框架中aggregare成员上的EntityId注释

Domain driven design Axon框架中aggregare成员上的EntityId注释,domain-driven-design,axon,Domain Driven Design,Axon,从Axon框架的文档中,以下是关于@EntityId的说明: Field annotation that marks the field containing the identifier of an Entity. Commands for a child Entity are routed to the Entity if the value of the Command's {@link #routingKey()} property matches the value of the an

从Axon框架的文档中,以下是关于
@EntityId
的说明:

Field annotation that marks the field containing the identifier of an Entity. Commands for a child Entity are
routed to the Entity if the value of the Command's {@link #routingKey()} property matches the value of the annotated field.

我仍然不明白,如果我的实体/聚合成员没有它,会产生什么影响。有人能帮忙吗?

EntityId是将对象中的字段标记为该对象的“实体标识符”的东西

从这里,我们可以了解聚合的简短描述是什么:

关联对象的集合,在数据更改方面充当单个单元

对它的引用仅限于单个单元,即聚合根

而且,一致性规则适用于对象组

这里的第一句话指定聚合通常不是单个对象,而是多个对象。 这些对象通常由实体和值对象组成,它们都具有以下描述:

价值对象

基本上由其属性定义的对象。这使得它们不可变

实体

基本上不是由属性定义的对象,而是由连续性线程和标识定义的对象

现在,我所分享的基本上只是领域驱动的设计细节。正如您所知,Axon旨在提供一种方法,根据这些指南正确建模。因此,我们知道聚合通常不是只有聚合根的单个对象,但它可能由多个对象组成,其中一些对象也需要可识别

这使
@EntityId
成为一个可用的组件,只要您有一个包含多个实体的聚合。通过Axon将对象标记为实体可以通过使用
@AggregateMember
注释来实现,使这些对象成为我们称之为聚合的“关联对象组”中的“命令处理成员”

您可能已经注意到,主聚合类Aggregate Root需要使用
@AggregateIdentifier
。该注释本质上只是
@EntityId
的一个更具体的版本。因此,它被元注释为
@EntityId
。由于聚合根需要可识别,因此它是描述中定义的实体

因此,当谈到何时使用
@EntityId
:如果您有一个简单的单类聚合,那么您已经在使用它了。当您需要多个实体(Axon的聚合成员)并且这些实体也需要可识别时,就可以清楚地使用它

当您希望这些聚合成员也处理命令时,通常会出现这种需求。更具体地说,如果您有一个可以处理命令的特定类型的聚合成员集合,则需要您在这些对象上提供
@EntityId
注释。否则,Axon无法知道要处理该命令的确切实例


顺便说一句,多实体聚合的细节在参考指南页上有定义。

谢谢@Steven的回答。在这里确认我的理解,如果我们有一个AggregateMember-like列表,那么在这种情况下,我们应该强制拥有EntityId,否则Axon无法知道您想要处理该命令的确切实例,但是如果我们有一个喜欢的人作为AggregateMember,那么拥有EntityId不是强制性的吗?