【问题标题】:List Vs Detail DTO列表与细节 DTO
【发布时间】:2019-10-03 17:19:53
【问题描述】:

我正在使用 ServiceStack 创建我的第一个 API。 在我的服务中,用户可以输入新订单并检索他已经执行的订单。 每个订单都有一个非常复杂的结构,由各种字段和对象列表组成(其中一些包含 10 或 100 个项目,其他包含数千条记录,因此需要分页)。

问题是:向客户端发送什么和多少数据。

假设,当客户请求上次执行订单的列表时,我应该提供一个包含少量字段的订单列表。

当客户要求提供订单的详细信息时,我可以给他更多信息。

在 REST 世界中,我看到了 2 种技术:

[视图]参数

/orders?view=list

/orders?view=detail

可以是“list | detail”,它提供了所请求对象的更简洁或更详细的版本。

[展开]参数

/orders?expand=customer

/orders?expand=customer,address,phones,address

允许指定要检索的字段

这样,无论用户请求对象列表还是详细信息,他都可以指定他想要接收的信息量。

This solution 被 Stripe.com 采用,还提供了一个 c# 客户端。

https://github.com/stripe/stripe-dotnet/blob/master/src/Stripe.net/Entities/ExpandableField.cs

如何使用 ServiceStack 实现这些解决方案,尤其是通过 http 和 ServiceStack.Client 都可以使用相同的 api?

创建两种类型的 DTO 是否是个好主意?

OrderDTO(包含少量字段)

OrderDetailDTO(包含所有 字段)

【问题讨论】:

    标签: servicestack


    【解决方案1】:

    您的选择取决于您的用例,通常您在查看所有订单时会返回摘要信息:

    /orders
    

    查看单个订单时的完整订单详情:

    /orders/1
    

    如果您想实现您的 ?expand 自定义,只需将其作为另一个属性添加到您的请求 DTO 中,然后使用它来测试您应该在您的响应 DTO 中填充哪些附加信息,例如:

    [Route("/orders")]
    public class QueryOrders : IReturn<QueryOrdersResponse>
    {
        public string[] Expand { get; set; }
    }
    
    public object Any(QueryOrders request)
    {
        var expand = new HashSet<string>(request.Expand ?? new string[0],
           StringComparer.OrdinalIgnoreCase);
    
        if (expand.Contains(nameof(Order.Customer)))
        {
           // populate Response DTO with additional info...
        }
    }
    

    【讨论】:

    • 当您说通常返回摘要信息或详细信息时,您是指两种不同类型的 DTO?
    • 是的 2 个不同的服务返回 2 个不同的 DTO 类型,即摘要和详细视图。
    猜你喜欢
    • 2021-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-28
    • 2018-06-10
    • 1970-01-01
    • 2019-10-04
    相关资源
    最近更新 更多