【问题标题】:Is this a good pattern for PATCH这是 PATCH 的好模式吗
【发布时间】:2013-02-08 13:45:51
【问题描述】:

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

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

【问题讨论】:

    标签: rest servicestack ormlite-servicestack


    【解决方案1】:

    这看起来没问题,尽管如果你只是抛出让它抛出 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
        };
    }
    

    【讨论】:

    • 感谢 Mythz,我没有注意到 Db 已经在我身边了!作为 ORMLite 的扩展,这是一个很好的候选者,所以我可以调用 Db.Patch(request)?
    • 您可以使用db.UpdateNonDefaults,或者您可以只拥有一个单独的部分DTO(例如[Alias("MyClass")] UpdateMyClass { ... }),只包含您想要更新的属性,然后调用db.Update(request)
    • 我遇到的问题是我允许 Patch 更新 DTO 上的任何一个或多个属性,这取决于应用程序/用户的更改内容。
    • 我可能误解了 db.UpdateNonDefaults。去写一些测试!
    猜你喜欢
    • 1970-01-01
    • 2010-10-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多