1

假设您有以下联系 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 建模以允许实现以下行为?

客户端可以提交一个请求,该请求将

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

    一种选择是为每个地址/电话号码/电子邮件地址/网站地址添加一个操作属性。

那么更新地址的代码如下所示:

        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 建模,同时避免重复?

4

2 回答 2

1

一般来说,我会尽量保持我的写入是幂等的,这意味着当您没有记录或所有记录(即存储或更新)时调用它应该具有相同的副作用(即最终结果)。

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

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

OrmLite 的 db.Save()命令对此有很好的支持,它检测记录是否已经存在并发出更新,否则将插入。

于 2012-09-05T17:49:10.810 回答
1

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

于 2012-09-06T12:22:32.320 回答