1

次の Contact 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 をどのようにモデル化すればよいですか?

クライアントはリクエストを送信できます。

  • 電話番号を追加、2 つの電話番号を更新、2 つを削除、2 つを追加
  • 2 つのメール アドレスを追加し、1 つのメール アドレスを更新し、3 つのメール アドレスを削除します
  • 3 つの Web サイト アドレスを追加し、2 つの Web サイト アドレスを更新し、2 つを削除します。あなたはアイデアを得る。

    1 つのオプションは、各 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 をモデル化するにはどうすればよいですか?

4

2 に答える 2

1

完全な状態を提供する代わりに、条件付きリクエストでETagを使用できます。ETagをリストのバージョンとして使用し、リストが変更されるたびに変更します。クライアント側では、ETagを使用して、If-None-Match httpヘッダーを使用して更新を要求し、要求の送信中にリストが変更された場合に402PreconditionFailedステータスを受け取る準備をします。

于 2012-09-06T12:22:32.320 に答える
1

一般に、書き込みを冪等に保つようにします。つまり、レコードがない場合、またはすべてのレコード (ストアまたは更新) がない場合に呼び出した場合と同じ副作用 (つまり、最終結果) が発生するはずです。

基本的にこれは、クライアントが完全な状態を送信することを意味します: つまり

  • 存在しないエントリ => 作成されます。
  • すでに存在するエンティティ => 更新され、
  • 一方、リクエスト DTO にないエンティティは削除されます。

OrmLite の db.Save()コマンドは、レコードが既に存在するかどうかを検出し、それ以外の場合は INSERT を発行して UPDATE を発行するという優れたサポートを備えています。

于 2012-09-05T17:49:10.810 に答える