【问题标题】:Is there any naming convention for IN and OUT DTO? [closed]IN 和 OUT DTO 有任何命名约定吗? [关闭]
【发布时间】: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&lt;int&gt; Grades 的服务中执行一些计算,而不是稍后在控制器的输出中显示它。因此,据我了解,我应该只创建一个不公开 List&lt;int&gt; 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


【解决方案1】:

没有用于命名 DTO 类型的单一标准或命名约定,因为这是一个实现问题——我不知道 ASP.NET Web API 团队也支持任何特定约定(也有很多使用实际实体的不良示例ASP.NET 官方文档中作为 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 请仔细阅读我的回答。
  • @Dai “我注意到了一个大趋势”不是来源。他们显然是在询问您是否可以指出任何实现您所引用的这种趋势的具体帖子/存储库/文件。如果不是,那很好,答案是否定的。您不必对此感到讨厌。
猜你喜欢
  • 2015-01-31
  • 1970-01-01
  • 2012-04-18
  • 1970-01-01
  • 2010-10-21
  • 2013-09-20
  • 2010-11-07
  • 1970-01-01
  • 2010-10-29
相关资源
最近更新 更多