是否有关于输入(IN)和输出(OUT)DTO的命名规范?

13
如果我要使用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的服务中执行一些计算,并且不在控制器的输出中显示它。因此,就我所知,我应该创建一个全新的DTO,它不公开List<int> Grades属性,对吗?如果是这样,如何命名这些“生成的DTO”才是正确的?或者应该将它们命名为Viewmodels?

谢谢!


2
你的 GET 操作为什么要有 DTO?GET 操作应该只有标量参数,而不是复杂类型或对象。否则请将其改为 POST 操作。 - Dai
@user2864740 是的,我正在投票关闭这个问题,因为它是基于观点的,但这并不意味着这个问题不值得回答。像这样的问题(当答案被适当地构建时可以客观地回答)应该允许在StackOverflow上提问。 - Dai
2
谢谢大家的见解!我喜欢请求/响应方法。我决定在SO上创建这个问题,因为我找不到一些有价值的资源来区分请求/响应DTO,他们总是谈论将DTO命名为{Entity}DTO,而且对于我来说,他们没有区分请求和响应之间的差异,这似乎很奇怪。 - Rod Ramírez
1
@RodrigoRamírez 这是因为通常会重用相同的DTO类型来处理请求和响应,特别是如果它代表一个领域实体/业务对象(例如产品、订单、发票等)。C#和.NET不支持混入或代数类型,因此通过组合现有类型定义一次性类型很麻烦。其他语言(如TypeScript)没有这个问题,因此它们有自己处理DTO的方式。 - Dai
或者你可以在Dto名称中加入http方法,例如StudentGetResponseStudentPutRequestStudentPostRequestStudentPostResponse。这样很容易知道在测试时何时使用哪个对象以及填充或期望什么属性。 - Muflix
显示剩余7条评论
1个回答

18

对于 DTO 类型的命名,没有单一的标准或命名约定,因为这是一个实现上的问题。我不知道 ASP.NET Web API 团队是否认可任何特定的惯例(官方文档中也有很多使用实际 Entity Framework 实体类型作为 DTO 的糟糕示例(不要这样做,除非你知道自己在做什么)。

然而,我注意到在 .NET 开发者社区中有一个普遍趋势,即“输入”DTO(正如您所称呼的那样)通常被命名为 ${ResourceName}Request,而输出/响应DTO则通常被命名为 ${Resource/Action}Response。此外,“Dto”作为类型名后缀也很常见。

但是,当涉及到命名约定和编码风格时,与其“正确”,通常来说更重要的是保持一致性。因此,如果您现有的项目使用 Dto 作为后缀,请继续使用它;但如果您的项目使用后缀,请不要轻易改变(除非有充分的理由)。

此外,避免使用模糊的名称,如 Id,而应该使用完整名称(StudentId)。

根据我的主观意见,根据您的示例,我会这样命名:

public class StudentCourseApprovalRequestDto
{
    public int       StudentId { get; set; }
    public List<int> Grades    { get; set; }
}

public class StudentCourseApprovalResponseDto
{
    public int  StudentId         { get; set; }
    public bool HasApprovedCourse { get; set; }
}

[HttpGet]
public StudentCourseApprovalResponseDto StudentHasApprovedCourse( StudentCourseApprovalRequestDto req )
{
    StudentCourseApprovalResponseDto resp  = _someService.CalculateStudentApprovedCourse( req );
    return resp;
}

嗨,你有这个趋势的一些来源吗? - live2
@live2 请仔细阅读我的回答。 - Dai
@Dai,“我注意到了一个普遍趋势”并不是一个来源。他们显然是在问你是否能指出任何具体的帖子/存储库/文件来实现你所提到的趋势。如果没有,那没关系,答案就是没有。你不需要表现得讨厌。 - Dotl

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接