【问题标题】:Making aggregates pageble in DDD [closed]在 DDD 中使聚合可分页 [关闭]
【发布时间】:2019-12-19 20:32:30
【问题描述】:

我有一个聚合通过 Controller、Service 和 Repository 层。根据 DDD,总体上没有关于 eloquent 模型的相关信息。我需要为存储库返回有关它的信息的聚合进行分页。

是否更适合为它创建另一个对象,或者我们可以将有关分页的信息放在 DDD 中的聚合中?

【问题讨论】:

  • 您能否说得更具体一些,您要分页什么?几个聚合实例?聚合是否是您想要分页的具有潜在巨大集合的复合对象?第二点是,您不会通过 App Controller 传递您的聚合,只有您的 DTO 应该到达该层。聚合在存储库和服务层之间的域中发挥作用,
  • 控制器从 json 创建聚合,然后将其传递给服务。 DDD有错吗? Aggregate 拥有很多实体,但我现在不关心实体,除了一个将对其进行分页的实体。例如,SchoolAggregate 包含学校、学生等。只有基本的学校 eloquent 模型会被分页。存储库将转换为 eloquent 模型进行聚合。此时,聚合应该包含像 current_page 这样的分页信息,还是应该创建另一个像 PageableAggregate 这样的对象?
  • 这里有几点:首先从JSON,应该生成一个DTO。这反过来又映射到一个聚合,这就是您传递给您的服务的内容。换句话说,您的聚合不应该是您向外界展示的 JSON,因为您将 API(客户端协议)与域实现结合在一起。
  • 第二 - 聚合通常是一个实体(当然有身份),它的所有子部分也由根聚合的身份定义。一个很好的例子可以是订单及其订单项目,它们属于订单,并且它们的身份和生命周期与订单相关联。在您的情况下,学生和学校之类的东西本身听起来很像实体(聚合根)(除非在您的域中它们只是代表值对象,但您仍然可能需要重新考虑您的设计)。
  • 您似乎需要的是分别为学校聚合、学生聚合等建模。使用您的学校存储库获取您想要的学校列表(在您的存储库中定义页面大小)。该列表是您返回给您的域层的内容,您将您的学校列表转换为 SchoolsDTO 列表,这就是您推送到您的 API/控制器层的内容。

标签: php domain-driven-design


【解决方案1】:

我们可以将关于分页的信息放到 DDD 中的聚合中吗?

这通常是一个错误;除非“分页”在您的域模型中是真实存在的,否则它听起来像是应用程序问题而不是域问题。

例如,您的 存储库 上可能有一些方法,这些方法返回从一组聚合中获取的结果页面。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-07-22
    • 1970-01-01
    • 2021-08-05
    • 2017-05-25
    • 2016-03-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多