domain-driven-design - DDD 处理随时间推移的聚合更新

标签 domain-driven-design event-sourcing aggregateroot

使用事件溯源,我有一个域,其中的聚合应不时更新。当我创建聚合时,我有一个到期时间(这可以是任意的),在那之后我必须更新实体的一些属性。 (这也可以使用 UpdateCommand 强制执行。)我想到的流程很少:

  1. 创建聚合后,我将聚合 ID 和到期时间存储在 RDBMS 中。
  2. 在 cron 作业中,我查询数据库中是否有过期的聚合,并提交 UpdateCommand

其他包括从读取端发出 UpdateCommands(或事件?)。 使用传奇来协调更新,这与第一个类似。但无论哪种方式,我都必须存储到期时间。

因此,我必须存储事件并以事务方式写入写入端的数据库中。但是,我不确定为写入端创建读取端(?)是否是 DDD 世界中的正确解决方案,或者是否适用?推荐的解决方案是什么?

最佳答案

我还需要在一段时间过后运行一些命令。

例如,我需要在 1 年后发出 ContractExpiredEvent(ContractAggregate 决定时间,但通常是 1 年)。问题是聚合必须决定何时执行以及执行什么命令,因此这是一个域问题,而不是基础设施问题。

我是怎么做到的?我的灵感来自Udi Dahan's 他在视频中介绍了术语“超时”。长话短说,聚合请求在一段时间过去后向其自身发送命令。它通过从命令处理程序生成它来实现这一点。底层 CQRS 框架获取预定命令并将其保存在一个特殊的存储库中。然后,cron 作业会在时间到来时处理所有计划的命令。

关于domain-driven-design - DDD 处理随时间推移的聚合更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48011846/

相关文章:

programming-languages - 真正的声明性语言?

c# - MVC - WCF - RabbitMQ - 通过消息队列到消费者的域事件加速或替代方案?

cqrs - 应如何托管事件溯源事件处理程序来构建读取模型?

c# - 在 DDD 的哪一层将类声明为聚合根?

c# - 非聚合根可以保存另一个非聚合根的引用吗?

domain-driven-design - 领域驱动设计——如何为公司和员工用例建模?

c# - DDD : Referencing non root Entities by Id from other Aggregates?

amazon-web-services - 从 AWS Eventbridge 存档中读取事件数据

cqrs - 在 CQRS 中维护聚合根引用。 Sagas 与命令处理程序

concurrency - 拆分聚合根以避免并发冲突