如何跟踪哪些实体\聚合已更改,因此应该保留?

时间:2017-10-03 20:17:09

标签: domain-driven-design event-sourcing

假设我有一些聚合A和B.聚合A发布聚合B订阅的一些事件。

  1. 如果在事件发布时尚未实例化B,则不会处理该事件。在这种情况下,谁负责实例化正在监听已发布事件的所有聚合?
  2. 之后所有聚合都处理了这个事件,我怎么知道哪些聚合已经改变了所以我可以坚持更改?
  3. 我很感激能够解决这些问题的工作示例链接

2 个答案:

答案 0 :(得分:0)

汇总B不能自行订阅已发布的事件。

首先,您应该考虑订阅在事务提交后应该处理的事件发生的EventBus。处理交易的最佳位置是ApplicationService。那么我认为最好的解决方案是使用MessageQueue将新闻传播到对该事件感兴趣的本地和远程有界环境。

答案 1 :(得分:0)

  

聚合A发布聚合B订阅的某些事件。

聚合接收命令并生成事件。他们无法接收来自其他聚合的事件。当我们拥有跨多个聚合的业务流程时,我们可以使用Saga/Process manager:它从聚合接收相关事件,并将命令发送给其他聚合。

  

如果在事件发布时尚未实例化B,则不会处理该事件。在这种情况下,谁负责实例化正在监听已发布事件的所有聚合?

订阅事件的实际方法取决于编程语言和其他内容。在我当前的PHP项目中,我使用EventSubscriber使用自动生成的event类到listener类的地图(一个event有零个或多个listeners )。此订户位于“应用程序”层中。这意味着在调度事件之前,它必须实例化每个侦听器,然后将事件发送给它。对于实例化,它使用DICHere更多关于这个框架(免责声明:它是我的)。

  

之后所有聚合都处理了这个事件,我怎么知道它们中的哪些已经改变了所以我可以坚持更改?

向聚合发送命令(不是事件 - 请参阅我的第一段)是CommandDispatcher的责任。这是来自Application层的服务,在发送命令之后,它会收集所有事件并使用EventStoreAggregateRepository中以原子(全部或全部)保留它们。

但事情之间可能存在并且将会出错。这就是为什么我们还需要跟踪事件调度的其他组件。我使用SagaEventTracker知道哪些事件被派遣到Sagas以及是否成功发送过。这最好与使Aggregates命令方法具有幂等性相结合,因为您可以多次向它们发送相同的命令而不会抛出异常(即使Aggregate不是幂等的,您也可以使用沉默的版本在佐贺斯的CommandDispatcher