2013-02-08 82 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

相关问题