Domain driven design DDD如何正确返回实体集合?

Domain driven design DDD如何正确返回实体集合?,domain-driven-design,Domain Driven Design,我有: @DomainAggregate @Entity class Meeting { ... more fields here private Set<AppUser> guests; public Set<AppUser> getGuests() { return Collections.unmodifiableSet(guests); } } @DomainAggregate @实体 班会{ ……这里有更多的田地 包房客人; 公共设置getGues

我有:

@DomainAggregate
@Entity
class Meeting {

... more fields here

private Set<AppUser> guests;

public Set<AppUser> getGuests() {
    return Collections.unmodifiableSet(guests);
}
}
@DomainAggregate
@实体
班会{
……这里有更多的田地
包房客人;
公共设置getGuests(){
返回集合。不可修改集合(来宾);
}
}
AppUser
是实体(而不是值对象)。 我不知道什么是正确的归还方式。 根据DDD,我的路线正确吗? (不能修改集合,但可以修改集合的元素) 或者我应该为AppUser对象创建dto类? (这将使我能够确保无法删除来自聚合内部的任何数据。) 从it外部访问,但将强制执行以下操作: 创建dto、复制数据等)

根据DDD,我的路线正确吗

根据埃文斯第6章,这是可以接受的。他写道(早在2003年)

聚合边界之外的任何内容都不能包含对内部任何内容的引用,根实体除外。根实体可以将对内部实体的引用传递给其他对象,但是这些对象只能暂时使用它们,并且它们可能不会保留引用

与前面的规则相反,通过数据库查询只能直接获得聚合根。必须通过遍历关联找到所有其他对象


为什么您会担心该集合是否可修改?这不重要,因为您不直接工作/修改实体,每个实体都通过聚合进行分配/更改/变异。您不应该有任何理由通过聚合以外的任何其他方式来持久化实体。聚合“暂时”等于“仅在方法级别使用,而不将其存储为类字段值”?更确切地说,
不存储在任何将在当前事务中生存的对象中。当我们释放对聚合根的引用时,整个批应该可以进行垃圾收集。