2017-10-18 103 views
0

我有一個API可以更新已存在的實體。該實體可以通過也存在API的接口手動更新。使用ASP.NET Web API更新API請求架構或設計模式中的某些字段

我的問題是如何只更新供應商可能通過實體上的API發送的某些字段的良好設計模式或架構?我不想用NULL或空字符串覆蓋字段,因爲他們在發送到API時不知道這些值,但是數據庫中的實體可能已經具有該字段的值。

這也應該考慮到供應商是否想要將字段重置爲某種空字符串。

實體API模式

ID 
Name 
TwitterHandle 

實體數據庫與價值觀範式

ID = 200 
Name = Hello 
TwitterHandle = @hello 

實體模型請求發送到API與價值觀

ID = 200 
Name = Hello2 

該請求應該只將名稱更新爲Hello2,但只保留TwitterHandle。然而,在另一要求,他們可以重置TwitterHandle如果事情與它(NULL,空字符串)發送

+1

我會建議接受只包含能夠被編輯爲特定的呼叫特性的視圖模型或DTO。這意味着你可能有多個。不要通過您的API來回發送實體。 – ovation22

+0

我有100個客戶端使用這個API,所以我不打算爲每個客戶創建一個模型 –

回答

0

想我找到了一個解決方案與Newtonsoft

JsonConvert.PopulateObject 

Populate Object

+0

你測試過嗎?因爲它不適合我。我嘗試了他們的動態對象的示例,但沒有注意到任何更改後,我的項目PopulateObject方法 –

+0

是的,我測試了它? –

+0

也實施它,像魅力一樣工作 –

0

如果你想在API級別做到這一點,那麼你可以使用HttpPatch如下

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 
} 

我會採取的另一種方法是使用Automapper。我將創建dto對象和automapper映射類,將dto轉換爲數據庫模型。這樣您也將遵循單一責任原則,因爲您的映射將成爲automapper配置的責任

+0

好的建議。該補丁似乎有一堆額外的東西,你必須發送來做一個我不想要的更新。我們已經使用了automapper,所以我們可以爲這個場景做一個映射,但是又決定了哪些屬性應該被更新。我認爲最好的選擇是手動序列化請求並測試請求中是否有可用屬性,然後更新數據庫模型屬性,這兩個屬性都必須是精確的。 –

0

我們過去做過的一件事是創建一個端點「http://webapi.com/twitter/200/name」,然後做一個包含更新。這並不完美,但它完成了工作,而且很容易實現。

+0

靠近,但他們可能想要更新多個屬性。我不希望他們發送逗號分隔列表。我寧願發送一個對象,以通用方式驗證缺少的字段,只更新放入請求中的字段。 –

+0

在這一點上唯一要做的事情確實是類似於補丁的東西,你可以使用JsonObject,但是你的映射配置不會很好玩。請記住,從json中刪除了空值,因此無法判斷它們是否發送null或什麼也沒有。 – ClaytonHunt