假设您有以下联系人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建模,同时避免重复?
答案 0 :(得分:1)
一般来说,我会尝试保留我的写作idempotent,这意味着当你没有记录或所有记录(即存储或更新)时,它应该具有相同的副作用(即最终结果)。
基本上这意味着客户端发送完整状态:即
OrmLite's db.Save()
命令对此有很好的支持,它会检测一条记录是否已存在并发出UPDATE,否则将INSERT。
答案 1 :(得分:1)
您可以将ETag用于条件请求,而不是提供完整状态。使用ETag作为列表的版本,并在每次更改列表时更改它。在客户端,使用ETag使用If-None-Match http标头请求更新,并准备好在发送请求时更改列表时接收402 Precondition Failed状态。