C# 为post和put请求分离DTO&;嵌套json作为post模型

C# 为post和put请求分离DTO&;嵌套json作为post模型,c#,asp.net-core,asp.net-web-api,C#,Asp.net Core,Asp.net Web Api,关于RESTful api,我有两个问题。 1.我们可以为GET、POST和PUT请求单独设置DTO吗?这是一个很好的做法,还是我可以创建一个具有公共属性的抽象类,然后从中继承 2.在POST请求中发送嵌套json是一种好的做法吗 如以下文章所述: 是的,更重要的是,你应该。DTO是特定场景中特定数据组的表示。这些数据在不同的请求类型之间可以也将是不同的。任何时候传输不同的数据时,都应该有不同的DTO来表示它 如果您愿意,您可以利用继承,这是有意义的。但是,请注意,由于modelbinding

关于RESTful api,我有两个问题。

1.我们可以为GET、POST和PUT请求单独设置DTO吗?这是一个很好的做法,还是我可以创建一个具有公共属性的抽象类,然后从中继承 2.在POST请求中发送嵌套json是一种好的做法吗

如以下文章所述:

  • 是的,更重要的是,你应该。DTO是特定场景中特定数据组的表示。这些数据在不同的请求类型之间可以也将是不同的。任何时候传输不同的数据时,都应该有不同的DTO来表示它

    如果您愿意,您可以利用继承,这是有意义的。但是,请注意,由于modelbinding的工作方式,您仍然需要使用具体的派生类作为参数,而不是一些基类。modelbinder将实例化param指定的类(因此它不能是抽象的),绑定该类上表示的任何请求值,并放弃其余的。因此,如果您绑定到
    基类
    ,您将拥有的只是
    基类
    ,而不是
    派生类
    ,即使请求主体是
    派生类
    的表示。如果随后尝试向下转换到
    DerivedClass
    ,则
    DerivedClass
    特定的所有属性都将为null/default

  • 这既不是好的做法,也不是坏的做法。JSON是一种对象表示格式。如果对象具有嵌套对象,那么JSON将具有嵌套JSON

  • 我们可以为GET、POST和PUT请求单独设置DTO吗?
  • DTO不是基于请求类型创建的,而是为实体创建的。例如,您有一个
    客户
    实体,对于
    客户
    实体,您将创建一个
    客户
    DTO,相同的
    客户
    DTO可用于
    客户
    实体的GET、POST和PUT请求

    我可以创建一个具有公共属性的抽象类,然后从中继承吗?

    是的,您可以在创建DTO时使用继承,但我要说的是,这太复杂了,没有附加值,请记住,如果使用不当,继承会增加系统中的耦合

  • 在POST请求中发送嵌套json是一种好的做法吗?

  • 正如Chris在回答中提到的,如果您的对象具有嵌套对象,那么您的JSON将具有嵌套JSON

    你能为你的问题添加更多的内容/代码/模型来更清楚地解释它吗?因此,对于一个
    客户
    实体,我应该为get设置一个单独的DTO,为post设置单独的DTO?这有什么意义?拥有多个DTO会增加什么价值?@FakharAhmadRasul:任何时候你有一组不同的数据,都应该有一个单独的DTO来表示这组特定的数据。就这么简单。如果不同的方法使用相同的数据集,那么它们可以共享相同的DTO。您不想做也不应该做的是尝试创建一些包含一组属性的超级DTO,然后将其用于多个方法,其中每个方法中只使用该数据的某个子集。这是一个糟糕的设计。在我的情况下,让我说,当我张贴客户。客户dto具有我在将更改保存到数据库之前生成的主键。如果我在put请求中使用相同的dto,并使用automapper映射属性。它将给我sql错误,因为无法修改主。然而,如果我在没有客户id的情况下进行单独的dto,我只需映射属性并保存更改,它就可以工作了。我回家后会发布一些代码片段,这将清楚我想问什么。谢谢你们的回复