【发布时间】:2020-07-31 01:44:47
【问题描述】:
如果我必须使用 MVC 架构创建某种 API,我将必须为控制器接收的 DTO 和控制器产生的 DTO 确定一个命名约定,我是对的吗?
例如,给定以下代码:
public class InStudentDTO
{
public int Id { get; set; }
public List<int> Grades { get; set; }
}
public class OutStudentDTO
{
public int Id { get; set; }
public bool HasApprovedCourse { get; set; }
}
[HttpPost]
public OutStudentDto StudentHasApprovedCourse(InStudentDto dto)
{
OutStudentDto outStudentDto = _someService.CalculateStudentApprovedCourse(dto);
return outStudentDto;
}
这只是一个愚蠢的例子,但重点是我想在具有属性List<int> Grades 的服务中执行一些计算,而不是稍后在控制器的输出中显示它。因此,据我了解,我应该只创建一个不公开 List<int> Grades 属性的全新 DTO,对吗?如果是这样,这个“生成的 DTO”的正确命名约定如何?还是应该将它们命名为 Viewmodel?
谢谢!
【问题讨论】:
-
为什么您的
GET操作有 DTO? GET 操作应该只有标量参数,而不是复杂类型或对象。否则将其设为 POST 操作。 -
嘿戴!很棒的收获!但正如我接下来要澄清的那样.. 这只是一个愚蠢的例子不是问题的重点
-
@Dai 完全自以为是的方法。有一些设计模型表明 (GET) 参数只是“DTO 字段”。
-
感谢您的洞察力!我喜欢请求/响应方法。我决定在 SO 上创建这个问题,因为我找不到一些有价值的资源来区分请求/响应 DTO,他们总是谈论将 DTO 命名为 {Entity}DTO,而且他们没有区分请求和响应之间的差异对我来说很奇怪。
-
@RodrigoRamírez 那是因为对请求 和 响应重用相同的 DTO 类型是很常见的,特别是如果它代表域实体/业务对象(例如产品,订单、发票等)。 C# 和 .NET 不支持 mixins 或代数类型,因此通过组合现有类型来定义一次性类型很麻烦 - 其他语言(如 TypeScript)没有这个问题,因此它们有自己的 DTO 工作方式。
标签: c# api viewmodel dto naming