1

我正在实现一个允许对象被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
    };
}

它有效,但感觉有些不对劲,我确定一定有更好的方法吗?

4

1 回答 1

0

这看起来没问题,尽管如果您只是在出现错误时抛出 let it throw C# Exceptions 并且如果您从ServiceStack 的 New APIService类继承您可以使用已经可用的属性,那么您的代码会短很多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
    };
}
于 2013-02-08T16:04:41.917 回答