2013-02-08 86 views
1

我正在實現一個REST樣式的API,允許一個對象被編輯爲PATCHPATCH操作的目的是允許在不觸及可能設置的其他屬性的情況下更新類中的一個或多個屬性。這是一個很好的PATCH格局

這些是ServiceStack OrmLite頁面的部分更新示例,但它似乎需要硬編碼來指示哪些字段將部分更新。在我的場景中,取決於應用程序決定發送哪些字段。

我還必須應付該對象可能尚未保存的場景。

爲了解決這個問題我已經實現了以下內容:

public object Patch(Myclass request) 
{ 
    HttpStatusCode SuccessCode; 
    try 
    { 
     var result = (MyClass)Get(request); 
     if (result != null) 
     { 
      request.PopulateWithNonDefaultValues(result); 
      dbFactory.Run(dbCmd => dbCmd.UpdateNonDefaults(request, r => r.myId == request.myId)); 
     } 
     else 
     { 
      dbFactory.Run(dbCmd => dbCmd.Save(request)); 
     } 

     SuccessCode = HttpStatusCode.Accepted; 
    } 
    catch (Exception e) 
    { 
     log.Error(e); 
     SuccessCode = HttpStatusCode.InternalServerError; 
    } 
    return new HttpResult() 
    { 
     StatusCode = SuccessCode 
    }; 
} 

它的工作原理,但東西感覺不對,我敢肯定,必須有一個更好的辦法?

回答

0

雖然你的代碼將是短了很多,如果你只是把讓它拋出C#異常時,有一個錯誤,如果你從ServiceStack's New API基地Service類繼承您可以使用已有的Db屬性,它看起來不錯,例如:

public object Patch(Myclass request) 
{ 

    var result = (MyClass)Get(request); 
    if (result != null) 
    { 
     request.PopulateWithNonDefaultValues(result); 
     Db.UpdateNonDefaults(request, r => r.myId == request.myId); 
    } 
    else 
    { 
     Db.Save(request); 
    } 

    return new HttpResult 
    { 
     StatusCode = HttpStatusCode.Accepted 
    }; 
} 
+0

謝謝Mythz,我沒有注意到Db已經在我身邊了!作爲ORMLite的擴展,這會是一個很好的候選人,所以我可以調用Db.Patch(request)? – MikeT 2013-02-08 19:40:03

+0

你可以使用'db.UpdateNonDefaults',或者你只需​​要一個單獨的部分DTO(例如'[Alias(「MyClass」)] UpdateMyClass {...}'),只需要更新的屬性並調用'db。更新(請求)'。 – mythz 2013-02-08 20:02:02

+0

我遇到的問題是我允許Patch更新DTO上的任何一個或多個屬性,取決於他們正在改變的是應用程序/用戶。 – MikeT 2013-02-08 21:04:36

相關問題