当使用带有事件的 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
将成为不相关事物的集合。“共享”一词与任何业务无关,已经表明它不适合用作模块。这并不是说根本没有共享代码,或者包含共享代码的模块永远都不存在。我只是说,它不太可能成为任何结构性问题的一般建议的起点,因为模块是任何模块化应用程序中的主要锚点。
事件也可以实现接口。如果问题是由于需要解决循环依赖关系而产生的(主要原因是人们本能地将代码移到共享模块中),请记住,模块也可以公开接口,声明一个事件侦听器,并让另一个模块的事件实现该接口。