Rest 为服务使用的DTO中的可编辑列表建模
假设您有以下联系人DTO。Address/PhoneNumber/EmailAddress/WebSiteAddress类也是简单的DTO(仅数据无行为) 我应该如何建模DTO以允许实现以下行为 客户端可以提交一个请求,该请求将Rest 为服务使用的DTO中的可编辑列表建模,rest,
servicestack,Rest,
servicestack,假设您有以下联系人DTO。Address/PhoneNumber/EmailAddress/WebSiteAddress类也是简单的DTO(仅数据无行为) 我应该如何建模DTO以允许实现以下行为 客户端可以提交一个请求,该请求将 添加电话号码、更新两个电话号码和删除两个添加两个 添加两个电子邮件地址,更新一个电子邮件地址,删除三个 添加三个网址,更新两个网址并删除 两个。你明白了 一个选项是为每个地址/电话号码/电子邮件地址/网站地址添加操作属性 然后更新地址的代码如下所示:
- 添加电话号码、更新两个电话号码和删除两个添加两个
- 添加两个电子邮件地址,更新一个电子邮件地址,删除三个
- 添加三个网址,更新两个网址并删除 两个。你明白了 一个选项是为每个地址/电话号码/电子邮件地址/网站地址添加操作属性
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建模,同时避免重复?通常我会尝试保留我的写入操作,这意味着它应该具有与在没有记录或所有记录(即存储或更新)时调用它相同的副作用(即最终结果) 基本上,这意味着客户端发送完成状态:即
- 哪些条目不存在=>将被创建
- 已存在的实体=>得到更新
- 同时删除不在请求DTO=>中的实体
db.Save()。将ETag用作列表的版本,并在每次列表更改时对其进行更改。在客户端,使用ETag使用If None Match http头请求更新,如果发送请求时列表发生更改,则准备接收402 predition Failed状态。没有示例,但当ETag发生更改时,我在我的OnPost中使用类似的内容:返回新的HttpResult{StatusCode=HttpStatusCode.PremissionFailed,StatusDescription=“PremissionFailed”,};
我在客户端使用它来捕获条件:catch(WebServiceException e){if(e.StatusCode==(int)HttpStatusCode.PremissionFailed)}
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);