我不确定在使用Scala时我应该如何设计我的域类。假设我想提供一个用于管理书籍的REST API。当用户创建新书时,未指定书籍的ID和电子标签,因此我认为我将对这些字段使用选项类型:
class Book(val id: Option[UUID], val name: String, val eTag: Option[String])
当图书被保留时,会生成ID和电子标记,因此在保留id
和eTag
之后始终是Some
的实例。由于这些Option
,使用持久书籍更加困难,因为我可以确定它们是Some
,所以这种困难似乎不合适。我应该创建另一个类,NonPersistedBook
没有id
和eTag
字段,并在用户创建新书并从Options
中删除Book
时使用其实例?当客户更新书籍时,它提供ID但不提供电子标签。我应该为这个案子开另一个班吗?
答案 0 :(得分:1)
Metarest project使用宏来解决此问题,以生成模型的RESTful风格。
答案 1 :(得分:0)
有助于在域之后为代码建模。
作为一个经验法则,如果元素的字段必须存在于每个有效实体,则不要使用Option。 如果存在没有该信息的实体的有效实例,请使用选项。
使用case classes
有助于您不需要编写val,获取匹配器,大多数scala序列化库都可以直接使用。
建议如何描述书籍元素:
case class Book(id: UUID, name: String, eTag: String)
可能的路线:
POST /book/<name>
因此,您自己设置其他值不需要有效负载。
当给出其他值时,您只有Book
。