servicestack,Rest,servicestack" /> servicestack,Rest,servicestack" />

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

Rest 为服务使用的DTO中的可编辑列表建模,rest,servicestack,Rest,servicestack,假设您有以下联系人DTO。Address/PhoneNumber/EmailAddress/WebSiteAddress类也是简单的DTO(仅数据无行为) 我应该如何建模DTO以允许实现以下行为 客户端可以提交一个请求,该请求将 添加电话号码、更新两个电话号码和删除两个添加两个 添加两个电子邮件地址,更新一个电子邮件地址,删除三个 添加三个网址,更新两个网址并删除 两个。你明白了 一个选项是为每个地址/电话号码/电子邮件地址/网站地址添加操作属性 然后更新地址的代码如下所示:

假设您有以下联系人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);