2017-10-18 1 views
0

既に存在するエンティティを更新できるAPIがあります。このエンティティは、APIが存在するインターフェイスでも手動で更新できます。ASP.NET Web APIでAPIリクエストアーキテクチャまたはデザインパターンから特定のフィールドを更新

私の質問は、ベンダーがエンティティのAPIを介して送信できる特定のフィールドのみを更新する方法に関する良いデザインパターンまたはアーキテクチャは何ですか? APIに送信するときに値がわからないため、フィールドの値をNULLまたは空の文字列で上書きしたくないのですが、データベースのエンティティには既にそのフィールドの値が設定されている可能性があります。

これは、ベンダーがフィールドを何らかの種類の空の文字列にリセットすることを希望する場合も考慮する必要があります。値エンティティー・リクエスト・モデルが値

ID = 200 
Name = Hello2 
でAPIに送信

ID = 200 
Name = Hello 
TwitterHandle = @hello 

エンティティAPIモデル

ID 
Name 
TwitterHandle 

エンティティデータベースモデル

このリクエストでは、名前をHello2に更新するだけで、TwitterHandleはそのままにしてください。あなたはAPIレベルでそれをしたい場合はしかし、何かがそれに送られた場合、彼らはTwitterHandleをリセットすることができます別の要求(NULL、空の文字列)

+1

と解決策を見つけたと思います。これは潜在的に複数のことを意味するでしょう。エンティティをAPIで前後に送信しないでください。 – ovation22

+0

私はこのAPIを使用する100のクライアントを持っていますので、それぞれのモデルを作成するつもりはありません –

答えて

0

は私が特定のコールのために編集することができる唯一のプロパティが含まれているのViewModelやDTOを受け入れることをお勧めしNewtonsoft

JsonConvert.PopulateObject 

Populate Object

+0

あなたはそれをテストしましたか?それは私のために働いていないです。私は動的オブジェクトを使ってサンプルを試しましたが、PopulateObjectメソッドの後に私のojectに何の変更も気付かなかった –

+0

はい私はそれをテストしましたか? –

+0

それも実装されている、魅力的な作品 –

0

に、あなたは

public void Patch(Guid id, JsonPatchDocument<SomeDto> patch) { 
    // Perform validation 
    var objectToUpdate = repo.GetById(id); // replace this with your database call 
    patch.ApplyUpdatesTo(objectToUpdate); 
    repo.Save(objectToUpdate); // save it to database 
} 

以下のようHttpPatchを使用することができますAutomapperを使う方法もあります。その中で、dtoをデータベースモデルに変換するdtoオブジェクトとautomapperマッピングクラスを作成します。この方法では、マッピングがオートマッパ設定の責任になるため、単一責任の原則に従うことになります

+0

良い提案です。パッチには、私が欲しくないアップデートをするために送信しなければならない追加のものがたくさんあるようです。 automapperを使用しているため、このシナリオのマッピングを行うことができますが、どのプロパティを更新するかを決定することもできます。私は最良の選択肢は、リクエストを手作業でシリアル化し、リクエストでプロパティが利用可能かどうかをテストし、両方のプロパティが正確でなければならないデータベースモデルプロパティを更新することです。 –

0

過去に行ったことの1つは、エンドポイント「http://webapi.com/twitter/200/name」を作成し、更新。それは完璧ではありませんが、それは仕事を完了し、実装するのはかなり簡単です。

+0

近づいていますが、複数のプロパティを更新したい場合があります。カンマで区切られたリストを送ってほしくない。私はむしろオブジェクトを送信し、どのフィールドが欠けているのかを一般的な方法で確認し、put要求のフィールドのみを更新します。 –

+0

その時点で唯一行うことは、実際にはパッチに似たものになるでしょう。あなたはJsonObjectを使うことができますが、マッピングの設定は面白くないでしょう。 nullがjsonから削除されるので、nullを送信したかどうかを知る方法はありません。 – ClaytonHunt

関連する問題