【问题标题】:Servicestack automap update endpointsServicestack 自动映射更新端点
【发布时间】:2020-01-09 14:32:19
【问题描述】:

我们正在使用 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 实用程序? ...

【问题讨论】:

    标签: servicestack ormlite-servicestack


    【解决方案1】:

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

    【讨论】:

    • 非常感谢 - 使用反编译器并有点头疼,看起来我应该能够很快地将一些东西放在一起。感谢您的团队为使 ServiceStack 实用程序变得如此强大所做的一切!
    • np :) source code for AutoQuery's impl 也应该有助于创建类似的解决方案。
    【解决方案2】:

    尚未进行大量测试,但看起来 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;
            }
    

    【讨论】:

    • 我个人不会像这样重新解析正文,因为请求 DTO 已经反序列化,并且仅适用于 JSON 服务。如果您想将 Request DTO 作为字典检索,您可以使用 ToObjectDictionary() ext 方法,对于任何无类型(即不在 Request DTO 上),您可以从 Request.QueryString/FormData 集合中获取它们。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多