假设我有一些聚合A和B.聚合A发布聚合B订阅的一些事件。
我很感激能够解决这些问题的工作示例链接
答案 0 :(得分:0)
汇总B不能自行订阅已发布的事件。
首先,您应该考虑订阅在事务提交后应该处理的事件发生的EventBus
。处理交易的最佳位置是ApplicationService
。那么我认为最好的解决方案是使用MessageQueue
将新闻传播到对该事件感兴趣的本地和远程有界环境。
答案 1 :(得分:0)
聚合A发布聚合B订阅的某些事件。
聚合接收命令并生成事件。他们无法接收来自其他聚合的事件。当我们拥有跨多个聚合的业务流程时,我们可以使用Saga/Process manager:它从聚合接收相关事件,并将命令发送给其他聚合。
如果在事件发布时尚未实例化B,则不会处理该事件。在这种情况下,谁负责实例化正在监听已发布事件的所有聚合?
订阅事件的实际方法取决于编程语言和其他内容。在我当前的PHP项目中,我使用EventSubscriber
使用自动生成的event
类到listener
类的地图(一个event
有零个或多个listeners
)。此订户位于“应用程序”层中。这意味着在调度事件之前,它必须实例化每个侦听器,然后将事件发送给它。对于实例化,它使用DIC。 Here更多关于这个框架(免责声明:它是我的)。
之后所有聚合都处理了这个事件,我怎么知道它们中的哪些已经改变了所以我可以坚持更改?
向聚合发送命令(不是事件 - 请参阅我的第一段)是CommandDispatcher
的责任。这是来自Application层的服务,在发送命令之后,它会收集所有事件并使用EventStore
在AggregateRepository
中以原子(全部或全部)保留它们。
但事情之间可能存在并且将会出错。这就是为什么我们还需要跟踪事件调度的其他组件。我使用SagaEventTracker
知道哪些事件被派遣到Sagas以及是否成功发送过。这最好与使Aggregates命令方法具有幂等性相结合,因为您可以多次向它们发送相同的命令而不会抛出异常(即使Aggregate不是幂等的,您也可以使用沉默的版本在佐贺斯的CommandDispatcher
。