Servicestack 自动映射更新端点

Servicestack automap update endpoints

我们正在使用 ServiceStack QueryDb 公开某些业务对象以进行自动查询,并且效果很好。

    [Route("/catalog/customers")]
    [Authenticate]
    public class QueryCustomers : QueryDb<ServiceModel.Catalog.Customer> { }

我们想实现某种 UpdateDb,它可以自动映射经过身份验证的 POST、PUT 和 DELETE 请求以插入、更新和删除自动映射的预定义 OrmLite 业务对象,但看不到任何网络上的例子。理想情况下,我们可以创建一个像这样简单的端点:

    [Route("/edits/customers")]
    [Authenticate]
    public class UpdateCustomers : UpdateDb<ServiceModel.Catalog.Customer> { }

如果这已经在 ServiceStack 库或其他地方的某处完成,我宁愿不必自己动手......这是 ServiceStack 已经支持的东西,还是我们自己开发这个 UpdateDb效用?...

这需要 AutoQueryCRUD 版本,但尚不存在,因此您需要正常实施更新服务。

尚未进行大量测试,但看起来 UpdateDb 将涉及针对 QueryDb 实现的一项调整 -

        public long CreateUpdate<From>(IUpdateDb<From> dto, Dictionary<string, string> dynamicParams, IRequest req = null)
        {
            long result;
            var db = GetDb<From>(req);

            var body = req.GetRawBody();

            var jsonObject = JsonObject.Parse(body);
            var obj = jsonObject.ConvertTo<From>();

            var id = (obj as IHasId<int>)?.Id;

            if (id == null)
                throw new Exception("Cannot update without identity field defined");

            if (req.Verb == "DELETE")
            {
                result = db.DeleteById<From>(id);
            }
            else if (req.Verb == "POST")
            {
                db.InsertAll(new[] { obj });
                result = ((IHasId<int>)obj).Id;
            }
            else
            {
                result = db.UpdateOnly(obj,
                    jsonObject.Keys.ToArray(),
                    u => ((IHasId<int>)u).Id == id);
            }

            return result;
        }