【问题标题】:Can an AggregateRoot be a child to an Entity in DDD (Domain-Driven Design)?AggregateRoot 可以成为 DDD(领域驱动设计)中实体的子节点吗?
【发布时间】:2020-03-15 00:48:39
【问题描述】:

我继承了一个使用领域驱动设计架构的项目,但我对 DDD 知之甚少。我一直在阅读很多关于它的博客和文献。目前,我有 3 个具有以下图形关系的域模型:Parent --> has many Children --> has many GrandChildren。我正在使用 EF Core 2.1 建立关系并将数据持久保存到数据库中。

  • 父母有PK
  • 子模型对父模型有一个 FK
  • 孙模型对子模型有一个 FK

我的问题是:下面的关系可以用于 DDD

问题:我无法将新孙子保存到现有子孙。

Parent 作为 AggregateRoot ==> Child 作为 Entity ==> GrandChil 作为 AggregatRoot

我可以使用 parent.add(child) 通过现有的“父级”保存“子级”,并且数据会毫无问题地持久保存到数据库中。

对于“孙子”,我使用了类似的方法:

  1. 先获取现有的父级,再获取现有的子级

  2. 将孙子添加到现有子项 [child.addNewGrandChild(new_grand_child)]

  3. UnitOfWork.Complete [这是它引发异常的地方,但我无法使用 Try/Catch 捕获异常]

【问题讨论】:

    标签: domain-driven-design


    【解决方案1】:

    了解正确完成 DDD 不会对数据库施加任何限制,相反,数据库不会对 DDD 或其模型施加任何限制。

    孙子不应该是聚合根。当你有类似的东西时,你很可能在你的域中缺少上下文和/或边界定义不正确。

    请记住,DDD 的关系概念与数据库和 fk 无关。就 DDD 而言,数据库被建模为整个系统的不透明存储依赖项。

    【讨论】:

    • 一个 AggregateRoot 可以是另一个 AggregateRoot 的子节点吗?例如,域实体 A 是 AggregateRoot,域 B 也是 AggregateRoot。但是域 B 有一个 FK_DomainA_Id。我还在学习有关 AggregateRoot 和实体的 DDD 概念。
    【解决方案2】:

    我通过将 Grandchild 类转换为 Entity 而不是 AggregateRoot 解决了我的问题。一旦我这样做了,一切都会奏效。换句话说,我能够通过 Parent 持久化数据。

    我对 DDD 还很陌生,所以我还没有掌握所有的概念。我继承了这个项目,并且为一个简单的任务必须为域模型、工厂方法和业务逻辑编写大量代码而不知所措。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-10
      • 2020-10-26
      • 1970-01-01
      • 2013-05-15
      • 2018-07-03
      相关资源
      最近更新 更多