在服务使用的DTO中建模可编辑列表

时间:2012-09-05 14:32:36

标签: rest servicestack

假设您有以下联系人DTO。 Address / PhoneNumber / EmailAddress / WebSiteAddress类也是简单的DTO(只是数据无行为)

public class Contact
{
    public Address[] Addresses { get; set; }
    public PhoneNumber[] PhoneNumbers { get; set; }
    public EmailAddress[] EmailAddresses { get; set; }
    public WebSiteAddress[] WebSiteAddresses { get; set; }
}

我应该如何建模DTO以实现以下行为?

客户可以提交

的请求
  • 添加电话号码,更新两个电话号码并删除两个添加两个
  • 添加两个电子邮件地址,更新一个电子邮件地址并删除三个
  • 添加三个网站地址,更新两个网站地址并删除 二。你明白了。

    一个选项是为每个Address / PhoneNumber / EmailAddress / WebSiteAddress添加一个Action属性。

然后更新地址的代码如下所示:

        var addressesToUpdate = serviceContact.Addresses.Where(x =>  x.AddressAction.ToUpper() == "UPDATE");
        var addressesToAdd = serviceContact.Addresses.Where(x => x.AddressAction.ToUpper() == "ADD");
        var addressesToDelete = serviceContact.Addresses.Where(x => x.AddressAction.ToUpper() == "DELETE").Select(x => x.AddressId);

对所有其他列表重复此操作可能会造成重复。

我的问题是:

如何使用可更新列表为服务DTO建模,同时避免重复?

2 个答案:

答案 0 :(得分:1)

一般来说,我会尝试保留我的写作idempotent,这意味着当你没有记录或所有记录(即存储或更新)时,它应该具有相同的副作用(即最终结果)。

基本上这意味着客户端发送完整状态:即

  • 哪些条目不存在=>得到了,
  • 已存在的实体=>得到更新,
  • 虽然请求中没有的实体DTO =>被删除。

OrmLite's db.Save()命令对此有很好的支持,它会检测一条记录是否已存在并发出UPDATE,否则将INSERT。

答案 1 :(得分:1)

您可以将ETag用于条件请求,而不是提供完整状态。使用ETag作为列表的版本,并在每次更改列表时更改它。在客户端,使用ETag使用If-None-Match http标头请求更新,并准备好在发送请求时更改列表时接收402 Precondition Failed状态。