我想在Scala 2.11和akka中做的是具有一个case类,但是根据被击中的路线进行两种不同的验证。
例如,让我们考虑下面的案例类
case class User(_id: String, name: String, age: Int, address: String)
现在在点击/create
路线时,我不需要_id
,但我需要所有其他字段。
但是在打/update
路线时,我需要_id
和要更新的字段(可以是一个或全部三个)
仅声明Option
并没有达到目的,因为那样我的/create
路线就折腾了。
即使扩展案例类也不能真正无缝地工作(代码重复过多)。
如果可能的话,我很乐意
case class User(_id: String, name: String, age: Int, address: String)
case class SaveUser() extends User {
require(name.nonEmpty)
require(age.nonEmpty)
require(address.nonEmpty)
}
case class UpdateUser() extends User {
require(_id.nonEmpty)
}
是否有一个优雅的解决方案?还是我必须创建两个相同的案例类?
答案 0 :(得分:0)
我的建议是为不同的需求编码不同的案例类,但是如果您坚持必须在这两种案例之间共享代码,则可能的解决方案是对案例类进行参数化
case class User[Id[_], Param[_]](_id: Id[String], name: Param[String], age: Param[Int], address: Param[String])
然后,您为Identity类型构造函数定义别名,并定义case类的两种用法
type Identity[T] = T
type SaveUser = User[Option, Identity]
type UpdateUser = User[Identity, Option]