当前位置: 首页 > 知识库问答 >
问题:

领域驱动的设计、事件来源和不断发展的模型

庾波光
2023-03-14

Eric Evans在DDD中谈了很多关于模型进化的话题,所以重构似乎对DDD是必不可少的。当一个人拥有世界的关系持久化状态时,可以通过迁移来处理模型更改,从而更改数据库模式

使用事件源时,如何应对模型更改?如果对聚合有不兼容的更改,这将阻止事件的重播,是否有某种最佳实践?还是只是不要?

共有3个答案

郎曜文
2023-03-14

事件只是DTO。只要你还有一个对象,如果事件本身没有改变,模型如何改变并不重要。如果需要更改事件,可以使用所需属性对其进行“升级”。Apply方法将知道如何处理它。不知道细节,我就想不出具体的东西。

如果模型变化太大,基本上现在有2个聚合根(AR)而不是前一个,这意味着您有了新的不同聚合,不再使用旧事件。基本上,您从旧AR开始,创建新AR,并生成特定于这些AR的相应事件。因此,在这种情况下,您实际上没有兼容性问题。

使用事件并不像“经典”OOP和RDBMS模式那样简单,但如果您从业务角度考虑,并将对象视为域概念,它们会更加灵活。更改模型意味着业务概念的定义或用法也发生了更改,因此现在您要处理一个不同的(就持久性而言是新的)概念。

傅元龙
2023-03-14

我自己也没有多少经验。但我看到了一个叫逆行的概念

最初是一个面向对象编程的概念,其中:“一个子类在需要时自动转换为它的超类”,上转换的概念也可以应用于事件来源。向上投射事件意味着将其从原始结构转换为新结构。与OOP上播不同,事件上播不能完全自动化,因为旧事件不知道新事件的结构。必须提供手动编写的上脚轮来指定如何将旧结构上脚轮到新结构上脚轮。

你可以参考Axon的医生了解更多细节

谷梁建中
2023-03-14

如果对聚合进行了不兼容的更改,将阻止事件的重播

在这种情况下,您基本上有两种选择:

  • 以使旧事件兼容的方式修补旧事件,并且事件可以从头开始重播。这里的好处是你不会失去历史,但缺点是你必须花费一些精力来修补旧的事件。
  • 在模式更改点获取聚合的快照/纪念品,并从这一点开始重新设置事件流的基。这里的好处是您不必花费任何精力(通过事件源,您很可能已经有了一个快照机制)。缺点是你失去了从快照之前重播事件的能力。

作为一般的经验法则,我认为默认为第二个选项,除非您确定需要能够在模式更改之前返回并编辑历史。

 类似资料:
  • 我正在学习DDD概念,为了加强我的理解,我正在研究一些现实世界的例子。 我知道一个聚合应该只有一个通过根实体的入口点,一个聚合应该只有一个存储库(如果我完全理解错了,请纠正我) 现在假设有特定类型的消耗品,并且这些消耗品是从配送中心发送的。发送特定类型的消耗品取决于它们的数量,我的意思是,如果其中一个消费者对A型和B型的临界数量为10,并且这些项目的数量低于10,那么配送中心发送A型和B型消耗品。

  • null 到目前为止,很容易。如果我们试图将规范应用到存储库,而又不破坏DDD模式或存在性能问题,那么问题就会出现。 应用规范的可能方法: 1)经典方法:在领域层使用领域模型进行规范 null null 3)与2)类似,但将规范作为持久层的一部分 这不起作用,因为域层需要参考规范。它仍将取决于持久层。 我们将在持久层中拥有业务逻辑。这也违反了DDD模式 4)与3类似,但使用抽象规范作为接口 nul

  • 本文向大家介绍谈一下领域驱动设计相关面试题,主要包含被问及谈一下领域驱动设计时的应答技巧和注意事项,需要的朋友参考一下 主要关注核心领域逻辑。基于领域的模型检测复杂设计。这涉及与公司层面领域方面的专家定期合作,以解决与领域相关的问题并改进应用程序的模型。在回答这个微服务面试问题时,您还需要提及DDD的核心基础知识。他们是: DDD主要关注领域逻辑和领域本身。 复杂的设计完全基于领域的模型。 为了改

  • 本文向大家介绍什么是领域驱动设计(DDD)相关面试题,主要包含被问及什么是领域驱动设计(DDD)时的应答技巧和注意事项,需要的朋友参考一下 专注于核心领域逻辑 在模型上找到综合的设计 不断与领域专家合作,改进应用程序模型并解决与领域相关的问题

  • 问题内容: 我过去是根据贫乏领域模型设计应用程序的,所以我有许多存储库对象,这些对象被注入到大型的,可识别事务的服务层。此模式称为事务脚本。由于它会导致过程代码,因此不认为这是一种好习惯,因此我想继续进行领域驱动的设计。 在阅读了网上的几篇文章,听过克里斯·理查德森(Chris Richardson)关于Parleys的演讲并阅读了《行动中的POJO》中DDD的各章之后,我想我已经了解了很多。 问

  • 3.6 ABP领域层 - 领域事件 在C#中,一个类可以定义其专属的事件并且其它类可以注册该事件并监听,当事件被触发时可以获得事件通知。这对于对于桌面应用程序或独立的Windows Service来说非常有用。但是, 对于Web应用程序来说会有点问题,因为对象是根据请求(request)被创建并且它们的生命周期都很短暂。我们很难注册其它类别的事件。同样地,直接注册其它类别的事件也造成了类之间的耦合