Domain driven design 指导何时使用CRUD ORM或切换到DDD事件存储的规则

Domain driven design 指导何时使用CRUD ORM或切换到DDD事件存储的规则,domain-driven-design,Domain Driven Design,我见过ORM使用一个工作单元在一个步骤中提交多个存储库 我还看到了DDD和通过存储库保存的聚合根的使用,当使用事件存储持久性在概念上变得非常容易理解时 我总是需要编写数据访问代码,虽然我熟悉ORM,但我对领域驱动的设计和事件源还不熟悉-事件源非常好,但有很多基础设施 最后,我想介绍一些规则,以帮助决定何时DDD+ES比CRUD系统更值得付出额外的努力(代码大小、数据库实体的数量) 以下是我的问题: 我没有看到聚合根合并到单个工作单元中,这是避免的吗?如果是,这会导致什么问题 在DDD中,客户实体

我见过ORM使用一个工作单元在一个步骤中提交多个存储库

我还看到了DDD和通过存储库保存的聚合根的使用,当使用事件存储持久性在概念上变得非常容易理解时

我总是需要编写数据访问代码,虽然我熟悉ORM,但我对领域驱动的设计和事件源还不熟悉-事件源非常好,但有很多基础设施

最后,我想介绍一些规则,以帮助决定何时DDD+ES比CRUD系统更值得付出额外的努力(代码大小、数据库实体的数量)

以下是我的问题:

  • 我没有看到聚合根合并到单个工作单元中,这是避免的吗?如果是,这会导致什么问题

  • 在DDD中,客户实体可能包含地址和电话(值对象),而在ORM中,有一个与客户、电话和地址存储库相关的工作单元。解释和理解这些不同方法的最佳方式是什么

  • ORM是否可以使用多个不同的工作单元(每个工作单元引用相关和相关的存储库/表)来表示聚合根

  • <> L> >P>从我的域到ORM的阻抗失配有什么值得注意的疼痛/警告信号,我们可以考虑切换到事件存储库?

  • 聚合定义了一致性边界。在NoSQL数据库中,通常不可能在每个事务中提交多个实体。因此,在使用NoSQL的DDD中,希望在一个工作单元中只有一个聚合,而对现有聚合外部实体的更新以某种方式交付

  • 如果地址和电话是有价值的对象,那么它们就不应该有存储库。在ORM中,它们将被映射为父实体的组件,而不是单独的映射

  • 我不确定你用这种方法能达到什么目的

  • 自然导致事件源的一个痛点是需要在聚合中保留所有状态更改。此外,事件源和域事件的概念通常提供了一种不同的域建模方法,重点是行为而不是状态。我会考虑当有潜在的商业价值保存所有国家的变化。如果您愿意进行初始基础设施投资,通过避免ORM疯狂,ES可以在许多方面变得更简单。将CRUD看作只有4种事件类型,甚至2种(读取、更新)的事件源。除了最基本的领域之外,除了对数据的更改之外,还希望有更多的上下文,这将导致您使用ES


  • 克鲁德不是只有一件事吗?更新