问题标签 [domain-events]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
303 浏览

domain-driven-design - 可以删除域事件吗?

为了使域事件处理保持一致,我想在保存AggregateRoot. 稍后使用事件处理器对它们做出反应,例如假设我想将它们作为集成事件发送到事件总线,我想知道在通过总线后是否允许从数据库中删除事件?因此,事件将永远不会被AggregateRoot根加载。

0 投票
3 回答
511 浏览

dependency-injection - 如何从域对象内分派域事件?

域对象不应该有任何依赖,因此也没有依赖注入。但是,当从域对象中调度域事件时,我可能希望使用集中的EventDispatcher. 我怎么能弄到一个?

我不想将事件列表返回给调用者,因为我希望它们保持不透明并保证它们的调度。这些事件只能由需要强制执行最终一致约束的其他域对象和服务使用。

0 投票
3 回答
924 浏览

domain-driven-design - DDD - 由于聚合数据不同而导致多个有界上下文?

我们尝试将我们的领域拆分为有界上下文,以实现模块化应用程序设计/架构。

我们做了一个启发性的 EventSorming 会话,它帮助我们识别有界上下文及其聚合。研讨会结束后,每个参与者都同意我们确定的有界上下文。

然而,我们感到不舒服,因为我们担心我们的有限上下文仍然太大。EventStomring 专注于领域事件/流程,这是我们用来识别有界上下文的主要构建块。

我们还确定了诸如“合同”之类的聚合。每个合约几乎都遵循相同的流程,这些合约包含的数据量可能会有很大差异。有非常简单的合同类型和合同类型,其中包括许多附加数据和附件。

仅仅因为聚合的数据更复杂而声明另一个有界上下文是否有意义?

这两种方法都有其缺点:

  1. 在一个有界上下文中实现所有合约类型可能会导致代码中出现大量 if 语句,以处理不同的数据。
  2. 仅仅因为某些数据不同,提取新的有界上下文可能会导致大量重复代码。

任何建议/最佳实践如何处理这个?

0 投票
1 回答
1431 浏览

domain-driven-design - 是否可以在没有依赖注入 (DDD) 的聚合(域层)中实现 MediatR?

为了防止重新发明轮子,我想在聚合中使用 MediatR 来发布域事件。(Un)幸运的是(?)MediatR 作为注入到类中的依赖项工作,而不是我可以静态调用的东西。因此,我最终会通过构造函数创建对库的直接依赖。

我不记得我在哪里读过它(如果我没看错的话),我应该避免聚合的构造函数中的非业务依赖。

因此,我不应该这样做:

这让我深入思考是否可以或推荐(或不推荐)在聚合中使用 MediatR...

有没有办法让我静态使用 MediatR 或者我应该实现自己的事件调度程序?

PS:另外,如果我对聚合依赖项的理解有误,请随时纠正我。

PS x2:我搜索了 Google 和 SO,但找不到答案。 https://stackoverflow.com/search?q=mediatr+domain+events 如何将 MediatR 与我的业务层 DDD 解耦:从域项目中引用 MediatR 接口

0 投票
1 回答
72 浏览

go - 领域事件的可靠异步处理

在并发系统中,域事件通常是异步处理的。在 Go 中,可以通过channels实现一种简单的异步事件处理方法,但问题是,如果在处理事件时发生了不好的事情,或者最糟糕的是,对于整个程序,事件将会丢失。

在 Go 程序中如何正确处理异步域事件,即:

  • 当事件处理程序失败时,不应从事件队列中清除该事件,以便在以后正确处理。
  • 如果整个程序出现故障,则必须恢复事件并进行相应的处理。
0 投票
1 回答
1656 浏览

spring-data-jpa - @TransactionalEventListener 注释的方法未在 @Transactional 测试中调用

我正在尝试按照以下帖子中提到的示例从实体实现域事件发布:

@DomainEvents 和 @AfterDomainEventsPublication 的示例

但是,我还没有设法让 Spring 调用我的方法,并使用 @TransactionalEventListener 进行注释。

请参阅下面的实体、服务、事件侦听器和测试代码:

服务:

听众:

测试:

未记录来自侦听器的日志消息。它在部署为 REST 服务并通过 Postman 调用时有效

0 投票
1 回答
926 浏览

design-patterns - 如何从现有的写入数据库生成 CQRS 中的读取数据?

目前我们有一个 Asp.net 应用程序,它使用 SQL 服务器进行写入和读取查询,就像一个普通的单体应用程序一样。

现在我们要转移到 CQRS。

在 CQRS 中,读取模型是基于事件生成的。

但是对于我的应用程序之前的事务数据,我们没有任何事件或日志。

那么我们如何从我们现有的 SQL Server 数据库的数据中生成 NoSql 数据库中的读取模型。

0 投票
2 回答
625 浏览

design-patterns - 如何在 CQRS 模式中更新写入模型数据库的模式更改中的读取模型?

在使用带有域事件的 CQRS 模式来生成读取模型时。

如果我们使用一些默认数据在数据库中添加新列或直接从 sql 查询手动插入新行,在这种情况下不会生成任何事件,那么如何更新现有生成的读取模型?

0 投票
1 回答
978 浏览

domain-driven-design - 在 CQRS 中的域事件处理程序中创建命令

我有一个关于 CQRS 和 DDD 的简单场景,但我无法找到实现它的正确方法:

Order 和 Buyer 是 Ordering 服务中的两个聚合根。当用户签出购物篮时:

  1. 在(篮子)服务中引发集成事件。

  2. 它在 Ordering 服务中的处理程序被调用。

  3. 在这个处理程序中,创建并分派了一个 CreateOrderCommand。

  4. 命令处理程序实例化一个“订单”。

  5. 结果,引发了域事件“OrderStartedDomainEvent”。

  6. 在它的处理程序内部,必须应用与其他聚合(例如买方)有关的副作用:买方被实例化(如果不存在)。

所以,在这种情况下,我想改变订单状态。更改订单状态需要命令。我应该在哪里发送这个命令?从我目前阅读的内容来看,在domain event handler中创建和调度命令是不合适的。

另外,如果我需要在这里引发域事件,我该怎么做?由于可能不会调用 Buyer 构造函数(如果它已经存在)。那么在域事件处理程序中引发域事件是否正确?

我搜索了很多,但以前的答案对我来说太复杂了。如果有人澄清,我将不胜感激。提前致谢。

0 投票
1 回答
477 浏览

events - DDD:具有值对象集合的实体 - 一个事件还是多个?

想象一个实例,其中我们有一个具有值对象集合的实体。

如果我们要向集合添加(例如域概念是分配)一个额外的记录值对象,我们将有如下内容:

这将引发:

直线前进。

现在想象一下不变量要求需要替换整个集合的情况。假设现在分配方法将替换实体中的所有当前记录。

IE。

引发单个事件会更好:

或为每个分配的记录创建一个单独的事件,然后一起发布集合:

我的担忧是:

  • 单个 RecordsAssignedEvent 将包含大量数据...想象一下分配了 10 条记录?100?
  • 我的领域事件仅包含原始类型。但是,如果我作为单个事件提出,我将被迫创建一些 DTO 或类似的东西以包含为一个集合。该 DTO 现在需要对事件的任何订阅者可用。如果我引发多个事件,我可以轻松地继续限制为原语。

在 DDDSample 应用程序中,有一个类似的场景,其中 Cargo 的行程由多个支路组成(在这种情况下,集合本身是由值对象组成的值对象):

https://github.com/citerus/dddsample-core/blob/master/src/main/java/se/citerus/dddsample/domain/model/cargo/Cargo.java

在这些情况下,是否有关于领域事件粒度的任何指导?