我有一个包含实体AAbstractElementXYZ的聚合。根实体是A,它也有一个AbstractElement列表。实体XYZ继承自AbstractElement。我需要将XYZ的实例添加到A的实例的可能性。一种方法是对每种类型(即addXaddYaddZ)使用一种方法。这些方法将创建XYZ实例所需的值作为参数。但是,每次添加从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

10-01 13:41