2013-02-08 3 views
1

Я реализую API стиля REST, который позволяет объекту быть PATCH 'ed. Цель операции PATCH - разрешить обновление одного или нескольких свойств в классе без прикосновения к другим свойствам, которые могут быть установлены.Является ли это хорошим шаблоном для 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 
    }; 
} 

Он работает, но что-то не чувствует себя хорошо, я уверен, что должно быть лучше?

ответ

0

Это выглядит нормально, хотя вы код будет намного короче, если вы просто бросить пусть бросить 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 
    }; 
} 
+0

Спасибо Mythz, я не заметил, что Db уже был для меня! Будет ли это хорошим кандидатом в качестве расширения ORMLite, поэтому я мог бы просто вызвать Db.Patch (запрос)? – MikeT

+0

Вы можете использовать 'db.UpdateNonDefaults' или вы можете просто иметь отдельный частичный DTO (например,' [Alias ​​(«MyClass»)] UpdateMyClass {...} ') только с теми свойствами, которые вы хотите обновить, и просто вызовите' db. Обновление (запрос) '. – mythz

+0

У меня проблема: я разрешаю Patch обновлять любые одно или несколько свойств в DTO, и это зависит от того, что они меняют. – MikeT

 Смежные вопросы

  • Нет связанных вопросов^_^