Конечные точки обновления автомата службы Serviceck - PullRequest
2 голосов
/ 09 января 2020

Мы используем 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? ...

Ответы [ 2 ]

2 голосов
/ 09 января 2020

Для этого потребуется CRUD-версия из AutoQuery , которая еще не существует, поэтому вам потребуется реализовать службы обновлений в обычном режиме.

1 голос
/ 09 января 2020

Много тестов не проводилось, но похоже, что 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;
        }
...