这是我正在处理的Web API项目特有的设计问题,但它可能是REST原则的一般问题。我也可能完全过分思考这个问题。
我在Entity Framework中有一个类,它有另一个类的子集合:
public abstract class Tracker
{
[Key]
public int ID { get; set; }
[MaxLength(50)]
public string Name { get; set; }
public virtual ICollection<Unit> Units { get; set; }
}
Unit类看起来像这样:
public class Unit
{
[Key]
public int ID { get; set; }
[MaxLength(50)]
public string Name { get; set; }
}
我正在开发一个Web API,它将获取跟踪器列表,并获取可用单元列表,然后将一个特定单元添加到跟踪器的单元列表中。跟踪器和单元有自己的API控制器和存储库,我试图弄清楚如何修改它们以支持创建这种关联,以及请求的样子。
是否适合通过PUT更新Tracker端点(/ Trackers / 1)以将新单元添加到列表中,可能与现有单元一起添加?我该如何处理后端?我认为我对PUT方法的一个心理障碍是 - 我会将整个子对象包含在请求正文集合属性中吗?它没有意义,但我不确定它会如何起作用。假设(在我的情况下)将是添加到跟踪器列表中的单元将是已存在的单元,我们只是创建关联。我是否可以使用DTO来实现这两个目标,并相应地映射它们?
或者更有意义的是创建一个新的联合DTO,例如“TrackerUnit”,其具有相应的端点,我可以通过POST到该端点(POST / TrackerUnits)来添加新的关联,然后在新的控制器中处理它?我认为它还需要支持DELETE来删除项目。我并不为这种方法感到疯狂,因为这个端点不会对应我系统中的任何实际资源,而只是用于映射这些关联。
答案 0 :(得分:5)
如何创建端点:
/Trackers/{id}/units
然后您可以将一个单元发布到此端点以与{id}标识的跟踪器关联,或类似地:
DELETE /Trackers/{id}/Units/{unitid}
删除单位。