Я пишу HTTP REST API, и я хочу строго типизированных классов модели в Scala, например. если у меня есть модель автомобиля Car
, я хочу создать следующий RESTful /car
API:Scala идиома для частичных моделей?
1) Для POST
с (создать новый автомобиль):
case class Car(manufacturer: String,
name: String,
year: Int)
2) Для PUT
сек (изменить существующий автомобиль) и GET
s, я хочу тег вдоль id
тоже:
case class Car(id: Long,
manufacturer: String,
name: String,
year: Int)
3) Для PATCH
эсов (частичное редактирование существующего автомобиля), я хочу этот частичный объект:
case class Car(id: Long,
manufacturer: Option[String],
name: Option[String],
year: Option[Int])
Но сохранение трех моделей по существу одного и того же элемента является избыточным и подверженным ошибкам (например, если я отредактирую одну модель, я должен запомнить другие модели).
Существует ли типичный способ поддерживать все 3 модели? Я в порядке с ответами, которые также используют макросы.
мне удалось объединить первые два из них следующим образом
trait Id {
val id: Long
}
type PersistedCar = Car with Id
Просто комментируя то, что чувствует, как код/дизайн запах. Ваш фактический объект - это автомобиль - с идентификатором, и это то, что должна содержать ваша модель домена, и это то, что нужно сохранить. Ваш REST запрашивает временные операции модели CRU [D] - создайте автомобиль, обновите автомобиль, получите автомобиль, и у вас должна быть объектная модель, которая дает понять, что это запросы. –
@Paul: Даже если я создаю отдельные модели для всех этих и скажу, что у меня есть модель домена 'Car.scala' и объектная модель' CreateCarRequest.scala', много полей повторяются снова и снова. – pathikrit