将 Spring Modulith 与事件结合使用时,将每个模块的事件放置在每个模块中是否是更好的做法?
- com.example
|- product
|- application
|- domain
|- events
|- Product.java
|- ProductEvent.java
|- package-info.java
|- spi
|- web
|- order
...
或者在
shared
模块中更好?
- com.example
|- product
|- application
|- domain
|- spi
|- web
...
|- shared
|- events
|- product
|- Product.java
|- ProductEvent.java
|- order
|- Order.java
|- OrderEvent.java
...
在我看来,如果我们将事件放在
shared
模块中,我们的模块将完全解耦。如果有一天我们需要将一个模块提取为独立服务(可能这永远不会发生),我们将不会有任何其他模块引用该模块。
事件属于发布它们的模块。首先,它们是总体状态转换的结果。这就是为什么你想让他们与那些人保持密切联系。
ProductEvent
真的不是一个事件。 ProductRegistered
或 OrderCanceled
是。
在我看来,如果我们将事件放在共享模块中,我们的模块将完全解耦。
不存在完全脱钩这样的事情。您所实现的只是所有模块都将耦合到共享模块,从而带来同时降低所有模块内聚力的缺点。
shared
将成为不相关事物的集合。
术语“共享”不具有任何业务相关性,这已经表明它不适合作为模块。并不是说根本没有共享代码,也不是说包含共享代码的模块永远不存在。我只是说它不太可能成为任何结构问题的一般建议的起点,因为 module 是任何模块化应用程序中的主要锚点。
事件也可以实现接口。如果问题是由于需要解决循环依赖关系(主要原因,人们本能地将代码移动到共享模块中),请记住,模块还可以公开一个接口,声明一个事件侦听器,并让另一个模块的实现该接口的事件。