Domain driven design 如何达到聚合内部成员的工厂方法?

Domain driven design 如何达到聚合内部成员的工厂方法?,domain-driven-design,Domain Driven Design,根据DDD,我们不应该从聚合边界之外引用聚合的内部成员,但通过这种方式,我将如何创建某个内部实体的对象,以便在创建聚合根实体的对象时使用它 例如: 我有一个聚合根文档和聚合根的内部成员Document,为了创建文档对象,我必须调用它的factory方法,但是在创建文档的过程中如何将页面与创建的文档关联?因为我们不能从聚合边界外部调用内部成员的工厂方法,所以我们认为在服务层中有以下代码, 我认为这是错误的代码 var page=page.CreatePage(param1、param2…等); v

根据DDD,我们不应该从聚合边界之外引用聚合的内部成员,但通过这种方式,我将如何创建某个内部实体的对象,以便在创建聚合根实体的对象时使用它

例如:

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

var page=page.CreatePage(param1、param2…等);
var document=document.CreateDocument(第页)


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

如果
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
因此,您应该将内部实体视为聚合根的实现细节,并避免将它们暴露给外部世界

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

例如,在下面的
页面中
是一个值对象
文档
聚合将从
页面
值创建内部
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);

如果
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
因此,您应该将内部实体视为聚合根的实现细节,并避免将它们暴露给外部世界

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

例如,在下面的
页面中
是一个值对象
文档
聚合将从
页面
值创建内部
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);

您确定文档是AR吗??文档和页面之间的关系是什么?文档可以没有页面而存在吗?您需要维护哪些不变量?如何通过文档公开页面?文档还有什么其他行为?具有多个页面的文档。。。。就像护照是一个文档,它的每一页都是页面,关系是一对多…不变量喜欢不按正确的顺序向文档中添加页面。。。我们可能还有很多其他行为,例如,您确定文档是AR吗??文档和页面之间的关系是什么?文档可以没有页面而存在吗?您需要维护哪些不变量?如何通过文档公开页面?文档还有什么其他行为?具有多个页面的文档。。。。就像护照是一个文档,它的每一页都是页面,关系是一对多…不变量喜欢不按正确的顺序向文档中添加页面。。。我们可以有很多其他的行为,例如,很好的一点,在被传递到文档感谢你的答案之后没有考虑改变对象,但是根据DDD,我不能在聚合之外创建一个页面实体对象,那么,我如何创建文档并将页面与它联系起来?!因为我们不能执行以下
var page=page.CreatePage(一些参数),然后将此页面传递给Document.CreateDocument(page)
好的,这样我可以确保不违反不变量,但我的整个问题是在聚合之外调用page的工厂方法,应该有一些方法,例如:
Document.AddPage(页面实体的参数)
这样好吗?@SalihKarabilo你看过我的答案了吗?在第二个示例中,
Page
是一个值对象,而不是实体。然后,
文档
将创建
文档。页面
根据它收到的
页面
值在内部创建实体。谢谢,当然我已经读过了,但我不希望页面成为一个值对象,它是一个实体。不调用内部“实体”可能没有解决方案吗聚合外部的成员工厂?页面不必是ValueObject,更一般地说,它可以是DTO,一个携带信息传递给聚合的简单对象,以便聚合可以使用它创建实体(或多个实体,不必是一对一)。另外,在聚合方法中只传递参数是不存在任何问题的,如果只使用少量的DTO,则不需要使用DTO。很好的一点,在把它传递给文档感谢您的答案之后,没有考虑改变对象,但是根据DDD,我不能在集合之外创建一个页面实体对象,所以,我如何创建文档并将页面与之关联?!因为我们不能执行下面的
var page=page.CreatePage(一些参数),然后将此页面传递给Document.CreateDocument(page)
好的,通过这种方式,我可以确保不违反不变量,但我的整个问题是在聚合之外调用page的工厂方法,应该有一些方法,例如