将根聚合为属性?

时间:2012-02-20 11:08:04

标签: java java-ee domain-driven-design

聚合根有子也是聚合根吗?如果是,它是仅引用它还是包含另一个聚合根的属性的聚合根是否具有通过该方法更改它的方法?

假设您有一个名为“Worker”的类,另一个名为“Company”。两者都是聚合根。公司拥有工人的财产。 很抱歉打造了一个糟糕的例子

public class Company {
    private Worker worker;

    ...

    public Worker getWorker() {
        ...
    }
}


public class Worker {
    ...
}

公司课程是否“隐藏”工人?

public class Company {
    private Worker worker;

    ...

    public String getWorkerName() {
        ...
    }
}


public class Worker {
    ...
}

工人是否只与公司班谈话,因为它不属于公司背景?为什么这样?是否像我的第一个例子那样访问其他聚合根中包含的聚合根? (我会这么认为,但我没有理由)

1 个答案:

答案 0 :(得分:1)

简而言之,没有。

这很难在SO答案中简洁地解释,但这里有一些可能有助于您理解的要点:

  • 聚合根是一致性边界。基本上,需要保持一致的所有数据都属于聚合根。当它具有高凝聚力时,你会知道它的结构正确 - 大多数方法都涉及很多私人财产。
  • 与聚合根或其子代的所有交互都应该通过聚合根上的公共方法完成。在您的示例中,如果工作者属于公司,则应通过公司上的公共方法添加/删除工作人员或对工作人员执行任何操作。
  • 可以拥有低于聚合根的实体,但根据我的经验,这通常是一种设计气味。根据我的经验,大多数情况下,您将值对象作为聚合的子项。
  • 聚合根之间的相关性是通过ID完成的,因此公司可能知道名为WorkerId的GUID,但它绝对不应该与Worker类耦合。 (这将使您更容易重构。)
  • 如果操作(即方法)取决于先前的数据状态,则只需要域模型(因此聚合根)。如果没有涉及状态变化,只需做CRUD。