我正在实现一个允许对象PATCH
编辑的REST样式API。 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 :(得分:0)
看起来没问题虽然你的代码会短得多,如果你只是抛出让它在出现错误时抛出C#异常,并且如果你继承自ServiceStack's New API base 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
};
}