15

ドキュメントを更新するためのリポジトリ メソッドがあるとします。

public Document UpdateDocument(Document document)
  {
  Document serverDocument = _db.Documents.Find(document.Id);
  serverDocument.Title = document.Title;
  serverDocument.Content = document.Content;
  _db.SaveChanges();
  return serverDocument;
  }

この場合、エンティティには 2 つのプロパティがあります。Document を更新する場合、JSON リクエストでこれらのプロパティの両方が必要になるためPUT /api/folder

{
  "documentId" = "1",
  "title" = "Updated Title"
}

「コンテンツ」が提供されていないため、エラーが返されます。私がこれを行っている理由は、null 許容プロパティとユーザーが更新しないプロパティであっても、指定されていないフィールドを null で上書きしないように、クライアントに要求でこれらのフィールドを指定するように強制する方が安全だと思われるためです。

これにより、たとえプロパティに null を指定することを意味する場合でも、PUT および POST リクエストですべての更新可能なプロパティを常に要求するようになりました。

これはクールですか、それとも必要なものだけをネットワーク経由で送信することで部分的な更新を容易にする可能性がある、まだ学んでいないパターン/プラクティスがありますか?

4

2 に答える 2

2

これはクールですか、それとも、必要なものだけをネットワーク経由で送信することで部分的な更新を容易にする可能性がある、まだ学んでいないパターン/プラクティスがありますか?

POSTorを実行する良い方法はPUT、その特定の要求に必要な値のみを含めることです。を行う際に、UpdateDocument「本当にここで行うべきこと」を自問する必要があります。そのオブジェクトに 100 のフィールドがある場合、それらすべてを更新する必要がありますか、それとも一部のみを更新する必要がありますか。あなたが本当にやろうとしている「行動」は何ですか?

User以下のフィールドを持つオブジェクトがあるとします。

public class User {
    public int Id {get;set;}
    public string Username {get;set;}
    public string RealName {get;set;}
    public string Password {get;set;}
    public string Bio {get;set;}
}

次に、2 つの使用例があります。

  1. ユーザーのプロフィールを更新する
  2. ユーザーのパスワードを更新する

これらのそれぞれを実行する場合、両方を実行する 1 つの update メソッドを使用しないか、使用することをお勧めします。ジェネリックUpdateUserメソッドを使用する代わりに、次のメソッドを使用する必要があります。

  1. UpdateProfile
  2. UpdatePassword

必要なフィールドのみを受け入れるメソッド。それ以上でもそれ以下でもありません。

public User UpdateProfile(int id, string username, string realname, string bio) {
}
public User UpdatePassword(int id, string password) {
}

ここで質問が来ます:

「ユーザー アクション」により、一部のフィールドにユーザーからの「入力なし」を許可する複数のフィールドの更新が可能になるユース ケースがありますが、モデル内のそのフィールドを更新したくありません。

ユーザーが自分のプロファイルを更新し、 の値を提供したがUsername、の値を提供しRealNameなかったとしBioます。Bioただし、すでに値がある場合は、null または空に設定したくありません。その後、それはアプリケーションのビジネス ロジックの一部となり、明示的に処理する必要があります

public User UpdateProfile(int id, string username, string realname, string bio) {
    var user = db.Users.Find(id);
    // perhaps a validation here (e.g. if user is not null)
    user.Username = username;
    user.RealName = realname;
    if (!string.IsNullOrEmptyWHiteSpace(bio)) {
        user.Bio = bio;
    }
}
于 2013-04-22T01:37:06.843 に答える