【问题标题】:How to reach the factory methods of the Internal members of Aggregate?如何到达 Aggregate 内部成员的工厂方法?
【发布时间】:2016-07-21 04:29:56
【问题描述】:

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

例如:

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

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

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

【问题讨论】:

  • 你确定 Document 是 AR 吗?文档和页面之间有什么关系?没有页面可以存在文档吗?您需要维护哪些不变量?页面是如何通过文档暴露出来的?文档还有哪些其他行为?
  • 具有多页的文档 .... 就像考虑 Passport 是一个文档,它的每一页都是页面,并且关系是一对多的 ... 不变量喜欢不向文档中的文档添加页面正确的顺序……我们可能还有很多其他的行为,例如,

标签: domain-driven-design


【解决方案1】:

如果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 聚合将根据 Page 值创建内部 Document.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);

【讨论】:

  • 好点,在传递给 Document 后没有考虑更改对象
  • 感谢您的回答,但根据 DDD,我无法在聚合之外创建 Page 实体的对象,那么,我将如何创建 Document 并将页面与之关联?!因为我们不能做以下var page=Page.CreatePage(some params) and then pass this page to Document.CreateDocument(page)好的,这样我可以确定不违反不变量,但我的整个问题是关于在聚合之外调用page的工厂方法,应该有一些方法示例如下:Document.AddPage(parameters for Page entity) 这样的做法好吗?
  • @SalihKarabilo 你看我的回答了吗?在第二个示例中,Page 是一个值对象,而不是一个实体。然后,Document 将根据收到的 Page 值在内部创建 Document.Page 实体。
  • 谢谢,我当然读过,但我不希望 Page 成为一个值对象,它是一个实体,有可能没有不调用内部“实体”成员工厂的解决方案来自聚合之外?
  • Page 不一定是 ValueObject,更一般地说,它可以是 DTO,一个携带信息以传递给聚合的简单对象,以便聚合可以使用它来创建一个实体(或多个,不一定是一对一)。另外,我认为只在聚合方法中内联传递参数没有任何问题,如果只有几个则不使用 DTO。
猜你喜欢
  • 1970-01-01
  • 2012-09-18
  • 2015-11-20
  • 1970-01-01
  • 2011-01-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多