我有一个包含实体A
,AbstractElement
,X
,Y
和Z
的聚合。根实体是A
,它也有一个AbstractElement
列表。实体X
,Y
和Z
继承自AbstractElement
。我需要将X
,Y
和Z
的实例添加到A
的实例的可能性。一种方法是对每种类型(即addX
,addY
和addZ
)使用一种方法。这些方法将创建X
,Y
和Z
实例所需的值作为参数。但是,每次添加从AbstractElement
继承的新类型时,都需要修改实体A
,所以我认为这不是最佳解决方案。
另一种方法是使用抽象添加方法addAbstractElement
来添加AbstractElement
实例。但是,在这种情况下,该方法将AbstractElement
的实例作为参数。因为此方法将由位于聚合外部的实体调用,所以按照DDD规则/要求,这些外部实体是否有权创建AbstractElement
的实例?我在埃里克·埃文斯(Eric Evans)的书中读到,外部实体无权持有除根以外的集合实体的引用?
此类问题的最佳实践是什么?
谢谢
最佳答案
摘自Evan的书,第139页:
“如果需要在预先存在的AGGREGATE中添加元素,则可以在AGGREGATE的根上创建一个FACTORY METHOD”
意思是,您应该在根(A)上创建一个工厂方法,该方法将获取AbstractElement的详细信息。此方法将根据某些决策参数创建AbstractElement(X / Y / Z),并将其添加到其内部AbstractElements集合中。最后,此方法返回新元素的ID。
最好的祝福,
Itzik Saban