【发布时间】: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/控制器层的内容。