RESTful接口 - 添加子对象

时间:2014-04-26 19:47:39

标签: c# rest

我公开了一个RESTful接口,允许添加CategorySubCategory类型。

分类

public class Category : EntityBase<Category>
{
    public string Name { get; set; }
    public bool Enabled { get; set; }

    public virtual ICollection<SubCategory> SubCategories { get; set; }
}

子类别

public class SubCategory : EntityBase<SubCategory>
{
    public int CategoryId { get; set; }

    public string Name { get; set; }
    public bool Enabled { get; set; }

    public virtual ICollection<Product> Products { get; set; }
}

我的问题是,我应该将Category对象与其关联的子项SubCategories一起传递,然后找出孩子的新内容:

public void AddSubCategory(Category category)
{
    // Figure out what object on the SubCategories collection are new (no PK value?)?
}

或者这样的方法会更好吗?:

public void AddSubCategory(int categoryId, SubCategory subCategory);

2 个答案:

答案 0 :(得分:3)

您的第二种方法更清晰,但可能需要更长的时间来设置前端。您可以直接将子类别推送到数据库/存储中[虽然我建议您检查存储过程或实体存储库以防止同名的两个子类别]。

使用第一种方法,您需要遍历整个子类别列表,并且可能会对每个子类别进行数据库调用,或者执行一些混乱的操作,例如将整个列表提交到存储过程并在其中进行流失。

第二种方法也会扩展得更好。考虑将多少数据发送到服务器,然后随着子类别列表的增长进行重新处理。

除了传输冗余数据并且需要潜在地引起大量额外的数据库调用之外,您可能会关注那些将实现您的API的人的样式选择,我认为开发人员会期望使用单独的方法来添加,更新,删除和发现提交整个列表令人困惑。

干杯

答案 1 :(得分:1)

嗯,我认为这个问题没有明显的答案,而且归结为品味问题。

就个人而言,如果您希望一次只添加一个对象,我将使用第二种方法,因为它可以节省您迭代子类别列表,这将有利于您的应用程序的性能。你永远不知道你的应用程序将如何扩展,你最终可能需要处理很多类别。

我要做的是采取第二种方法,但由于你已经在第二种方法中有了一个CategoryId,我只想将签名更改为:

public void AddSubCategory(SubCategory subCategory);

从subCategory中提取类别ID。