我是 DDD 的初学者,围绕小而简单的领域工作,以便让我了解所有设计原则。
我有这个简单的域:机构 (Institution
) 及其可用的 WiFi 热点 (Place
) 保存在数据库中。没有机构,任何地方都无法存在。机构有管理者用户-受让人(User
),它有权添加新的地方,重新分配或删除现有的地方。
Code can be found here .对值对象的验证暂时留在后面。
这受 Mathias Verraes on child entities 影响.
它是正确的 DDD 设计吗?或者至少接近它?
作为一个以数据为中心的程序员,我仍然想知道如果经验法则是通过聚合根访问聚合,我将如何列出所有机构的所有位置?
在实体本身 (Place::create
) 中生成 Uuid
的想法好吗?
只有受让人(用户
)可以添加/删除位置的想法应该在域本身上表达,还是应该由客户负责?在这种情况下,如果受让人知道他管理的机构(User
中的institutionId
?)将是明智的。
Institution::placeById
是否违反了 DDD 的任何原则?也许这是存储库的责任?
最佳答案
聚合根规则只适用于写端。如果有专用的读取模型,这个问题就会消失。您应该可以自由转换以阅读适合您的用户场景的模型。
否则,您可以将机构中的所有地点添加到散列集,然后返回扁平化列表。
在设计聚合根时,请考虑更新场景。地点可以独立于机构更新吗?如是。那么它可能是它自己的聚合根。
通常存储库应该确定下一个 ID。
通过包含权限列表的角色表达用户权限。在每个方法中传递发件人并检查方法内部的访问权限。这也允许轻松测试访问权限。
关于php - DDD 中实体之间的关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40867639/