哪种嵌套 class 类型最适合领域事件?

What nested class type is best suitable for Domain Events?

我在我的 Java 微服务中遵循领域驱动设计和清洁/六边形架构。我在聚合根 class 中将域事件声明为非静态嵌套 classes。我的问题是这些 classes 应该是静态嵌套 classes 还是非静态嵌套 classes(inner classes)?

我使用了非静态嵌套 classes,但 IntelliJ IDEA 建议将它们设为静态。根据 Robert Simmons 的 Hardcore Java 书,

an inner class is instance-scoped and a static nested class is class-scoped.

正如我在领域驱动设计中所理解的那样,没有聚合实例,拥有领域事件实例就没有任何意义。这就是我选择使用非静态嵌套 classes 的原因。有人可以解释一下吗?谢谢

静态嵌套 class 对我来说似乎是更好的选择,因为域事件没有理由引用聚合根的 this(它们就是这样的) d 获取它们是否嵌套 classes)。最好明确指出域事件有一个字段明确标识它们是什么事件(不一定是聚合)。

嵌套classes类型的主要区别
- non-static 嵌套 class 可以完全访问其嵌套的 class 的成员和方法。它引用了外部 class 实例。
- static nested class 没有对嵌套实例的引用,因此 static nested class 无法调用 non-static 方法或访问嵌套它的 class 实例的 non-static 字段。

因此,如果我们将 Domain Event 定义为 non-static 嵌套 class,它将具有对 Aggregate 实例的完全访问权限。这违反了主要 Domain Event 特征。

不变性
Domain Event 必须是不可变的,附加整个 Aggregate 状态违反了不变性。它不应该包含概念的完整状态,只有可能对订阅此事件的人有用的上下文信息的副本。

领域事件没有业务逻辑
另外Aggregate可以封装业务约束。如果 Domain Event 有聚合实例,它可以访问业务逻辑。

结果, 我们只需要使用 static 嵌套 class.

请注意 Domain Events 可能会被本地和外部限界上下文使用,但 Aggregate 受限于一个上下文。在这种情况下,最好将 Domain Events 移动到单独的 class。可能有例外情况