Spring Modulith - 在哪里放置事件?

问题描述 投票:0回答:1

将 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
模块中,我们的模块将完全解耦。如果有一天我们需要将一个模块提取为独立服务(可能这永远不会发生),我们将不会有任何其他模块引用该模块。

spring spring-modulith
1个回答
0
投票

事件属于发布它们的模块。首先,它们是总体状态转换的结果。这就是为什么你想让他们与那些人保持密切联系。

ProductEvent
真的不是一个事件。
ProductRegistered
OrderCanceled
是。

在我看来,如果我们将事件放在共享模块中,我们的模块将完全解耦。

不存在完全脱钩这样的事情。您所实现的只是所有模块都将耦合到共享模块,从而带来同时降低所有模块内聚力的缺点。

shared
将成为不相关事物的集合。

术语“共享”不具有任何业务相关性,这已经表明它不适合作为模块。并不是说根本没有共享代码,也不是说包含共享代码的模块永远不存在。我只是说它不太可能成为任何结构问题的一般建议的起点,因为 module 是任何模块化应用程序中的主要锚点。

事件也可以实现接口。如果问题是由于需要解决循环依赖关系(主要原因,人们本能地将代码移动到共享模块中),请记住,模块还可以公开一个接口,声明一个事件侦听器,并让另一个模块的实现该接口的事件。

© www.soinside.com 2019 - 2024. All rights reserved.