设计包含对象列表的 DTO
Designing DTOs that contain lists of objects
假设我有以下领域模型:
Project Task
- Id - Id
- Name - Name
- List<Task> - Project
一个项目有多个任务,一个任务有一个项目。
现在假设我要创建一个 TodoListDTO 数据传输对象。我最初的想法是这样做:
TodoListDTO
- List<Project>
看似简单。然后我可以访问每个项目中的任务列表。然后我在几个地方读到 DTO 应该尽可能扁平。但是我如何在不使用复杂对象的情况下对其进行建模?
我可以有一个类似于 TodoListDTO 的 ProjectDTO:
ProjectDTO
- ProjectId
- Name
- List<TaskId>
- List<TaskName>
但是拥有单独的 TaskIds 和 TaskNames 列表似乎很不方便,而且我看不出这比在 ProjectDTO 上拥有一个列表 属性 有什么好处。
处理这个问题的好方法是什么?
您之前的 classes 非常简单并且是标准的实现方式。您将创建一个 Context class 来保留项目和任务列表。一共三个classes.
您可以做的另一件事是创建
的另一个域模型
ProjectTask
- ProjectId
- ProjectName
- TaskId
- TaskName
这可能有助于处理一对多关系(也允许多对多关系)并避免令人困惑的循环项目->任务->项目->任务结构。从这里您可以让您的 API 客户按 projectId 对所有 ProjectTasks 进行分组并以这种方式处理它。
话虽这么说,我认为你原来的方法很好,但这里有一个替代方法。
假设我有以下领域模型:
Project Task
- Id - Id
- Name - Name
- List<Task> - Project
一个项目有多个任务,一个任务有一个项目。
现在假设我要创建一个 TodoListDTO 数据传输对象。我最初的想法是这样做:
TodoListDTO
- List<Project>
看似简单。然后我可以访问每个项目中的任务列表。然后我在几个地方读到 DTO 应该尽可能扁平。但是我如何在不使用复杂对象的情况下对其进行建模?
我可以有一个类似于 TodoListDTO 的 ProjectDTO:
ProjectDTO
- ProjectId
- Name
- List<TaskId>
- List<TaskName>
但是拥有单独的 TaskIds 和 TaskNames 列表似乎很不方便,而且我看不出这比在 ProjectDTO 上拥有一个列表 属性 有什么好处。
处理这个问题的好方法是什么?
您之前的 classes 非常简单并且是标准的实现方式。您将创建一个 Context class 来保留项目和任务列表。一共三个classes.
您可以做的另一件事是创建
的另一个域模型ProjectTask
- ProjectId
- ProjectName
- TaskId
- TaskName
这可能有助于处理一对多关系(也允许多对多关系)并避免令人困惑的循环项目->任务->项目->任务结构。从这里您可以让您的 API 客户按 projectId 对所有 ProjectTasks 进行分组并以这种方式处理它。
话虽这么说,我认为你原来的方法很好,但这里有一个替代方法。