嵌套集合的DTO设计注意事项

时间:2015-01-09 07:17:03

标签: api design-patterns asp.net-web-api api-design

鉴于我有一个表示城市的模型,其中包含街道的集合。

public class City {
    public int Id { get; set; }
    public string Name { get; set; }
    public IEnumerable<Street> Streets { get; }
}

public class Street {
    public int Id { get; }
    public string Name { get; }
    public IEnumerable<Building> Buildings { get; }
}

如果客户对所有城市(api/cities/all)感兴趣并且我将全部收集归还给他,那么这将导致大量响应,具体取决于数据集。所以我首先想到的是只返回 streets 集合中的 street ids 。然而,这感觉很尴尬,因为虽然 ids 可能对进一步获取街道有用,但它们对客户端没有任何有意义的价值(填充 ID列表没有意义在一个视图上,以显示街道城市中的内容,不是吗?)。

我的下一个想法是完全放弃 streets 集合,而是提供一个API端点来获取 city 街道

api/cities/3737/streets

这样我就可以获取 streets 的完整列表,但是返回的数据不会包含街道所属的任何信息。如果我的客户现在想要显示街道 city ,他必须进行2次API调用才能获得所需的信息。

返回此类数据的常用方法是什么?

1 个答案:

答案 0 :(得分:1)

我会创建2个城市对象,一个仅包含基本数据的城市对象(如ID和名称)和一个包含所有数据的cityDetail对象(包括完整的街道计划)。
根据您的情况,您可以对建筑物重复此模式 然后,您可以在列表调用中返回城市对象,并且只有在执行get by id时才会返回cityDetail对象。


坏=&gt;你的api是排序&#34;不一致&#34;通过列表获得的城市对象与通过get获得的城市对象不同。你可以制作2个资源:city&amp; cityDetail with cityDetail没有List功能和城市没有getByID功能,但它仍然不是那么干净&amp;可预测为单一资源。

好=&gt;性能明智&amp;用法明智,这通常是一个完美的匹配。您永远不会显示街道城市列表,因此城市对象就足够了。当您查看单个城市时,您很可能希望显示包括街道在内的所有数据(或至少在该页面上使用此数据),因此cityDetail对象也适合此处。 性能方面明显的是,为getAllMyCities调用获取1个百万街道是显而易见的;)