2012-02-20 103 views
2

聚合根可以有也是聚合根的儿童吗?如果是,它只引用它,还是保持其他聚合根的属性的聚合根具有通过该方法更改它的方法?将聚合根作为属性?

假设您有一个名为“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

总之,没有。

这是有点儿很难在一个SO回答简明扼要地解释,但这里的几个要点,可以帮助您的理解:

  • 的聚合根是一致的边界。基本上,需要保持一致的所有数据都属于聚合根目录。当它具有很高的凝聚力时,你会知道它的结构正确 - 大多数方法都会触及很多私有属性。
  • 所有与聚合根或其子代的交互应通过聚合根上的公共方法完成。在你的例子中,如果员工属于公司,那么添加/删除员工或对员工执行任何操作应该通过公司的公共方法完成。
  • 可以有聚合根下的实体,但根据我的经验,这往往是一种设计气味。大多数情况下,根据我的经验,您有价值对象作为聚合的孩子。
  • 聚合根之间的关联是通过ID完成的,因此公司可能知道一个名为WorkerId的GUID,但它绝对不应该耦合到Worker类。 (这将允许您更轻松地进行重构。)
  • 如果操作(即方法)取决于数据的以前状态,则只需要一个域模型(并因此聚合根)。如果不涉及状态变化,只需执行CRUD。
+0

但是这个例子中的worker是否也可以在其他聚合根内?因为它本身就是一个聚合根? – LuckyLuke 2012-02-21 17:38:47

+0

当你说在聚合根下没有实体时,你的意思是这些对象不应该像实体一样映射到数据库中的表? – LuckyLuke 2012-02-21 17:40:12

+0

我不明白最后一部分。 – LuckyLuke 2012-02-21 17:41:05