C# Web Api - returning DTO 时移动应用程序的最佳实践?多个请求或 return 一次全部?

C# Web Api - Best Practices for Mobile Applications when returning DTO? Multiple Requests or return Everything at once?

我正在构建一个移动应用程序,我正在使用 WebApi 作为后端。该应用程序允许用户虚拟设计他们的家。

所以,考虑到每个 属性 都是唯一数量的房间和房间类型(即车库、棚屋等),这对我创建的所有属性都不常见 简介的想法。请记住,我正在创建一个应用程序,让您可以虚拟地布置您的家。这意味着每个 属性 都有一个配置文件 翻译如下:

特别感兴趣

我需要能够从我即将构建的 UI 中捕获此内容:

属性 个人资料摘要(参考如下)

Id | Name | Quantity
--------------------
1  | Master Bed Room   | 1
2  | Standard Bed Room | 4
3  | Master Bathroom   | 1
4  | Bathroom          | 3
5  | Kitchen           | 1
6  | Living Room       | 1
7  | Garage            | 1

以下是我希望我的 return DTO 从 WebApi 调用中查看的方式。 (这描述了上面的前两行:(Master Bed Room, Standard Bed Room))

这里假设我通过虚拟界面在主卧室添加了一张特大床,在 4 个标准卧室添加了双床

{
    Property:
    [
        {
            Id: 1,
            Name: 'Sample Property',
            StreetAddress1: '123',
            ...,
            Profile:[
                {
                    Area: {Id: 1, Name: 'Master Bed Room', Type: {...}},
                    Quantity: 1,
                    Profiles: [
                        {
                            Id: 1,
                            LineItems: [
                                Id: 1,
                                Name: 'King Size Bed',
                                ...
                            ]
                        }
                    ]
                },
                {
                    Area: {Id: 2, Name: 'Standard Bed Room', Type: {...}},
                    Quantity: 4,
                    Profiles: [
                        {
                            Id: 2,
                            LineItems: [
                                Id: 2,
                                Name: 'Twin Size Bed',
                                ...
                            ]
                        },
                        {
                            Id: 3,
                            LineItems: [
                                Id: 3,
                                Name: 'Twin Size Bed',
                                ...
                            ]
                        },
                        {
                            Id: 4,
                            LineItems: [
                                Id: 4,
                                Name: 'Twin Size Bed',
                                ...
                            ]
                        },
                        {
                            Id: 5,
                            LineItems: [
                                Id: 5,
                                Name: 'Twin Size Bed',
                                ...
                            ]
                        }
                    ]
                },
            ]
        }
    ]
}

我的问题如下:

我想知道构建 WebApi 调用或任何值得阅读的好文章的最佳实践是什么。我可以 return 基于用户的整个对象 登录时的id

优点是在移动应用程序(不是网络应用程序而是移动应用程序)中假设一个人最多有两个属性。 (这只是一个概念证明 - 但我会 想知道什么(如果有的话)是最佳实践)。我还可以开发 WebApi,以便执行以下操作:

User Login -->
 <-- Return Properties
 User Selects Property -->
  <-- Return Property Profile Summary (referenced above)
User wants to drill down on particular room (Standard Room) -->
    <-- Return standard room overview line items (the Profiles[] from the above object)
User want to see the products  (line items) for a given Standard Room (1 of the 4 selected) (Area: {Id: 2} from above object) -->

还有类似的东西?

最佳做法是什么?

不错的选择是使您从 Web API 编辑的模型 return 适应应用程序中的屏幕和表单。这意味着您不应该 return 实体,而是将其转换为根据您的应用需求设计的数据传输对象。

如果您的应用有一些屏幕的列表,例如 "projects" 包含房间总数和上次修改日期,"rooms" 包含所有家具的总成本,还包含包含所有家具的详细信息页面混凝土房间中的产品及其数量,您的数据库包含几个表,如 "RoomTypes"、"Rooms"、"Products"、"ProductPrices"、"ProductTypes"、"Projects"那么你已经有了数据库对象的实体,应该为你的表单添加模型类:

public class ProjectListItem
{
    public int ProjectId { get; set; } // you need this field for identification and navigation
    public DateTime LastModifiedDate { get; set; }
    public int Rooms { get; set; }
}

public class RoomListItem
{
    public int RoomId { get; set; }
    public string Name { get; set; }
    public int Area { get; set; }
    public decimal TotalCost { get; set; }
}

public class RoomDetailsItem
{
    public int RoomId { get; set; }
    public string Name { get; set; } // ok, that looks like you can select a base class for this models
    public int Area { get; set; }
    public ICollection<ProductModel> Products { get; set }
}

public class ProductModel
{
    public string Name { get; set; }
    // public decimal BestPrice { get; set; } // you should not add this property because your "details" page not contained this info
    public int Quantity { get; set; }
}

好的,现在你的 API 看起来像下一个:

  • /api/v1/Projects - return 是 ProjectListItem
  • 的集合
  • /api/v1/Projects/{projectId} - return 是 RoomListItem 的集合 或包含此系列的模型
  • /api/v1/Projects/{projectId}/{roomId} - return一个RoomDetailsItem

您需要在 API 中将您的实体转换为该模型。存储模型应根据您的应用程序需求(快速检索或避免重复)进行优化,您的演示模型应根据您的应用程序需求进行优化。