【问题标题】:Should I have different DTOs for Create and Update? (CRUD) [closed]我应该有不同的 DTO 来创建和更新吗? (CRUD)[关闭]
【发布时间】:2017-09-06 10:36:35
【问题描述】:

我正在设计一个对 Person 实体进行常规 CRUD 操作的 Web API。

问题是我不知道如何设计 DTO。

实体如下:

public class Person 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
}

我已确定 DTO 应该具有完全相同的成员:

public class PersonDto 
{
    public int Id { get; set; }
    public string Name { get; set; }
    public int Age{ get; set; }
}

这对于 Update 操作是有意义的,但是 Create 呢? Id 由 ifself 的 Create 操作创建,因此在 DTO 中有 Id 不符合语义。

我应该创建 2 个不同的 DTO,一个有 Id,另一个没有 Id?

什么是最好的选择?您是否有用于创建和更新的不同 DTO?

【问题讨论】:

  • DTO 是群体性精神病的一个例子。改用命令/响应模式,问题就消失了
  • 您能否提供一些示例或链接以了解该模式?关键字太宽泛,搜索它返回了很多有点误导的结果:) 谢谢
  • Don't use DTOs problem solved. 这种重复的成本很高,因此架构需要从这种分离中获得巨大的好处才值得。我认为您的 DTO 确实没有任何好处,它与另一个对象相同,那你为什么要使用它?
  • 你已经有了实体,为什么要把它复制到另一个对象上?大多数(如果不是全部)设计模式在被滥用时可能会变成反模式。 DTO 也不例外。我记得我第一次看到登录窗口的 MVVM 示例代码。我曾经在一个班级中编写的这个简单的日常示例突然变成了 5 个班级的野兽。恕我直言,编写代码时要记住的最重要的事情是 KISS。
  • 直接使用你的实体....

标签: c# .net entity-framework dto


【解决方案1】:

您可以使用任何一种方式。如果您对每个操作使用单独的 DTO - 这需要大量的代码编写(和时间花费)。我更喜欢为所有操作使用一个 DTO,并在需要时创建其他 DTO。

【讨论】:

    【解决方案2】:

    创建操作不需要其他 DTO。您只需为创建新对象设置默认值(id=0)。这将帮助您确定对象是否尚未在数据库中创建,以防万一。但是,如果您将 ID 为零的 DTO 传递给用于创建操作的方法,您将永远不会遇到任何问题。

    【讨论】:

    • 好的,听起来不错。但是,我发现我的 Web API 的 Create 操作正在接受一个 Id,尽管它会被忽略,但我发现它非常具有误导性。例如,我现在正在使用 Swagger,在 Create 操作的 Example 值中它显示 { "Id": 0, "Name" = "string", "Age" = 0 } 它应该只显示 Name 和年龄。
    • 对于 web api 请求,您不必随其发送 ID。您应该只发送 {"Name" = "string", "Age" = 0}。在 C# 中,将默认分配 0。这不应该打扰您,因为 0 无论如何都不是有效的 ID。
    • 对于 web api 请求,您不必随其发送 ID。您应该只发送 {"Name" = "string", "Age" = 0}。在 C# 中,将默认分配 0。这不应该打扰您,因为 0 无论如何都不是有效的 ID。
    • 我认为这已经足够清楚了,但是关于我的 API 的消费者,我看到了这个问题 => 请检查它,因为这是一个新问题:stackoverflow.com/questions/46077652/…
    猜你喜欢
    • 1970-01-01
    • 2015-03-18
    • 1970-01-01
    • 2012-10-15
    • 1970-01-01
    • 1970-01-01
    • 2013-10-20
    • 1970-01-01
    • 2014-07-30
    相关资源
    最近更新 更多