如何到达Aggregate内部成员的工厂方法?

时间:2016-07-20 07:43:32

标签: domain-driven-design

根据DDD,我们不应该从聚合边界之外引用聚合的内部成员,但是这样我将如何创建一个内部实体的对象,以便我可以使用它来创建聚合根实体的对象?

例如:

我有一个聚合根文档和聚合根的内部成员,名为Document,为了创建一个Document对象,我必须调用它的工厂方法,但是如何在创建时将Page与创建的Document关联起来文献?因为我们不能从聚合边界之外调用内部成员的工厂方法,所以考虑我们在服务层中有以下代码, P.S:我认为这是错误的代码

var page=Page.CreatePage(param1,param2...etc); var document=Document.CreateDocument(page);

这是错误的,因为我们不应该从聚合边界外部访问CreatePage,那么如何解决当我们想要创建聚合根实体时如何创建聚合根的内部成员的问题?

1 个答案:

答案 0 :(得分:4)

如果Page是一个实体,那么你不应该在其聚合根之外创建它,因为这会打破封装。

例如,如果Document不能包含多个具有相同标题的网页,则可以通过直接访问Page对象来违反不变量。

例如,

var page1 = new Page('some title');
var page2 = new Page('some other title');
var document = new Document([page1, page2]);
page2.changeTitle('some title'); //this breaks the invariant

出于这个原因,您应该将内部实体视为聚合根的实现细节,并避免将它们暴露给外部世界。

您可以使用值对象来将页面信息传递给文档。

例如,以下Page中的值对象Document聚合将根据Document.Page值创建内部Page实体。

var page1 = new Page('some title');
var document = new Document([page1]); //Document.Page entities are created internally

var page2 = new Page('some other title');
document.addPage(page2);