我正在为数据库开发一个REST API,其中包含有关虚拟机和服务器的信息以及有关它们的某些信息;已安装软件,磁盘,存储和可用存储等。
我希望能够使用此REST API来直接通过应用程序从计算机更新数据库,并希望拥有一个Web前端,用户可以在其中查询以查找各种计算机的当前状态。 / p>
我正在使用Entity Framework和ASP.NET MVC来搭建API,但是遇到了我没有必要经验来解决的问题。过去我对数据库的工作更加直接和具体,我从未创建过API,因此以前不需要序列化数据库中的数据。
我发现的问题是,当序列化数据时,以一对多和多对多的关系进行操作,例如,一个对象可能包含一系列相关对象,而每个对象可能都包含对父对象的引用,然后再次包含相同的列表。因此,在进行序列化时,最终可能会将这些对象无限递归地加载到序列化响应中。例如:
class Machine {
int ID;
string Name;
List<Software> Software;
}
class SoftwareInstallation
{
int MachineID;
int SoftwareID;
}
class Software {
int ID;
string Name;
List<Machines> Machines;
}
这里是多对多关系。如果我加载计算机,它将有一个软件列表,每个软件都有一个计算机列表。当我只想要一个对象时,我最终可能会加载整个数据库。
我想知道在API设计中解决此问题的常用方法是什么。我不想为API调用发送太少的数据,否则客户端将有太多工作要做,但我也想避免发送太多或更糟糕的结果是响应大小无限。我知道诸如惰性和急速加载等概念,以及如何使用Entity Framework调用它们,但是我不确定何时使用哪种方法,以最大程度地减少所需的API调用次数,同时降低加载过多的风险。 / p>