Я реализую 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
};
}
Он работает, но что-то не чувствует себя хорошо, я уверен, что должно быть лучше?
Спасибо Mythz, я не заметил, что Db уже был для меня! Будет ли это хорошим кандидатом в качестве расширения ORMLite, поэтому я мог бы просто вызвать Db.Patch (запрос)? – MikeT
Вы можете использовать 'db.UpdateNonDefaults' или вы можете просто иметь отдельный частичный DTO (например,' [Alias («MyClass»)] UpdateMyClass {...} ') только с теми свойствами, которые вы хотите обновить, и просто вызовите' db. Обновление (запрос) '. – mythz
У меня проблема: я разрешаю Patch обновлять любые одно или несколько свойств в DTO, и это зависит от того, что они меняют. – MikeT