Domain driven design 如何跟踪哪些实体\聚合已更改,因此应持久化?

Domain driven design 如何跟踪哪些实体\聚合已更改,因此应持久化?,domain-driven-design,event-sourcing,Domain Driven Design,Event Sourcing,假设我有一些聚合A和聚合B。聚合A发布聚合B订阅的某个事件 如果B在事件发出时还没有被实例化,它将不会处理该事件。在这种情况下,谁的责任是实例化所有侦听已发布事件的聚合 在所有聚合处理完事件之后,我如何知道它们中的哪一个发生了更改,以便能够持久化更改 如果这些问题得到解决,我将非常感谢与工作示例的任何链接。Aggregate B自身无法订阅已发布的活动 首先,您应该考虑一个事件总线< /Cord>,订阅发生在事务提交后应该处理的事件。处理事务的最佳场所是ApplicationService。在我

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

  • 如果B在事件发出时还没有被实例化,它将不会处理该事件。在这种情况下,谁的责任是实例化所有侦听已发布事件的聚合
  • 在所有聚合处理完事件之后,我如何知道它们中的哪一个发生了更改,以便能够持久化更改

  • 如果这些问题得到解决,我将非常感谢与工作示例的任何链接。Aggregate B自身无法订阅已发布的活动


    首先,您应该考虑一个<代码>事件总线< /Cord>,订阅发生在事务提交后应该处理的事件。处理事务的最佳场所是

    ApplicationService
    。在我看来,最好的解决方案是使用
    MessageQueue

    聚合B本身无法订阅已发布的事件,将消息传播到对事件感兴趣的本地和远程有界上下文

    首先,您应该考虑一个<代码>事件总线< /Cord>,订阅发生在事务提交后应该处理的事件。处理事务的最佳场所是

    ApplicationService
    。在我看来,最好的解决方案是使用
    MessageQueue
    将新闻传播到对事件感兴趣的本地和远程有界上下文

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

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

    如果B在事件发出时还没有被实例化,它将不会处理该事件。在这种情况下,谁的责任是实例化所有侦听已发布事件的聚合

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

    在所有聚合处理完事件之后,我如何知道它们中的哪一个发生了更改,以便能够持久化更改

    向聚合发送命令(不是事件-请参见我的第一段)是
    CommandDispatcher
    的责任。这是一项来自应用层的服务,在发送命令后,它将收集所有事件,并使用
    AggregateRepository
    EventStore
    中以原子方式(全部或无)持久化它们

    但在这两者之间,事情可能也会出问题。这就是为什么我们还需要跟踪事件调度的其他组件。我使用一个
    SagaEventTracker
    ,它知道哪些事件被分派到哪个saga,以及它们是否成功分派。这与将聚合命令方法设置为幂等函数结合使用效果最佳,因为您可以多次向它们发送相同的命令,而不会引发异常(即使聚合不是幂等函数,您也可以在Sagas中使用静音版本的
    CommandDispatcher

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

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

    如果B在事件发出时还没有被实例化,它将不会处理该事件。在这种情况下,谁的责任是实例化所有侦听已发布事件的聚合

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

    在所有聚合处理完事件之后,我如何知道它们中的哪一个发生了更改,以便能够持久化更改

    向聚合发送命令(不是事件-请参见我的第一段)是
    CommandDispatcher
    的责任。这是一项来自应用层的服务,在发送命令后,它将收集所有事件,并使用
    AggregateRepository
    EventStore
    中以原子方式(全部或无)持久化它们

    但在这两者之间,事情可能也会出问题。这就是为什么我们还需要跟踪事件调度的其他组件。我使用一个
    SagaEventTracker
    ,它知道哪些事件被分派到哪个saga,以及它们是否成功分派。这与将聚合命令方法设置为幂等函数结合使用效果最佳,因为您可以多次向它们发送相同的命令,而不会引发异常(即使聚合不是幂等函数,您也可以在Sagas中使用静音版本的
    CommandDispatcher