在webApi中加载链接/子数据的正确方法

本文关键字:数据 方法 webApi 加载 链接 | 更新日期: 2023-09-27 17:49:41

我对如何在RESTful web api中正确加载具有1对1,1对许多关系的实体的数据有点困惑,并且想知道人们是否可以给出建议哪种方式是正确的,也许为什么不应该这样做。我认为这让我更困惑,因为我也试图创建一个web应用程序来显示数据,我不想围绕web应用程序构建web api,我相信很多人都犯了这样的错误。

我们的代码有许多1对1关系和1对多关系。

例如Company和Contact。

现在,如果我要通过webApi加载一个联系人,目前它将显示一个类似于下面的模型

public class ContactModel() {
    public long Id { get; set; }
    public string Name { get; set; }
    public long CompanyId { get; set; }
}

这对我来说似乎是正确的,如果我想要公司的详细信息,我只需要从公司api加载数据。

然而,在我们的web应用程序上,它使用我们的webApi,我想在一个页面上显示这个记录,它似乎不适合我在我们的web应用程序中进行2个单独的调用来加载所有的数据?也许这是因为我习惯了ASP。NET和加载数据一次?

所以我想要一个这样的模型吗?

public class ContactModel() {
    public long Id { get; set; }
    public string Name { get; set; }
    public CompanyModel Company { get; set; }
}
public class CompanyModel() {
    public long Id { get; set; }
    public string Name { get; set; }
}

现在这很有意义,因为现在我有Company作为模型,我也可以向用户显示联系人所属的公司名称,加上我有companyId,所以如果我想将它们传递到Company屏幕(使用公司id作为参数),我可以使用它。另外,现在我可以在我的web应用程序中使用一个web api调用,而不是两个。

但是…当我在一个页面上显示许多联系人时怎么办?是的,我可以使用上面的方法,但是如果所有的联系人都是同一家公司的,那么为每个联系人加载相同的CompanyModel似乎有点没有意义。也许这样会更好。

public class GetModel() {
    public ICollection<ContactModel> Contacts { get; set; }
    public ICollection<CompanyModel> Companies { get; set; }
}
public class ContactModel() {
    public long Id { get; set; }
    public string Name { get; set; }
    public long CompanyId { get; set; }
}
public class CompanyModel() {
    public long Id { get; set; }
    public string Name { get; set; }
}

现在我可以将所有联系人加载到contacts集合中,并将所有相关公司加载到companies集合中。但是这是否完全违背了通过RESTful web api加载数据的规则呢?

任何关于webApi设计关系的指导将不胜感激。

在webApi中加载链接/子数据的正确方法

我正在考虑是把这篇文章作为评论还是作为回答。争论主要是因为设计是主观的,很大程度上取决于你想要解决的问题。

My CompanyModel和ContactModel匹配您的第二个实现,尽管第一个/第三个实现在内存方面是最有效的。我使用第二种实现只是因为我在MVC页面和WebAPI控制器上共享我的模型。在那里有CompanyModel允许我在编写Razor时访问公司信息。然而,如果你不写Razor(或者像我一样,随着时间的推移,你意识到你更喜欢使用Javascript MVC/MVVM框架,如AngularJS或JSViews),那么在第一/第三个实现中编写它是最有意义的。对我来说,第二个实现允许我在需要时加载CompanyModel,并在不需要时将其保留为空。(这是我不重构代码的一个小理由,因为我的编码风格已经改变了。)