我在Scala 2.11和akka中尝试做的是有一个案例类,但有两个不同的验证基于哪个路由被击中。
例如,让我们考虑下面的案例类
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)
}
有一个优雅的解决方案吗?或者我是否必须创建两个相同的案例类?
我的建议是针对不同的需求编写不同的案例类,但如果你坚持要在这两种情况之间共享代码,可能的解决方案是参数化案例类
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]