使用我获得的案例类在scala中实现我的域模型
abstract class Entity {
val _id: Option[BSONObjectID]
val version: Option[BSONLong]
}
和几个定义不同实体的案例类,如
case class Person (
_id: Option[BSONObjectID],
name: String,
version: Option[BSONLong]
) extends Entity
我需要的是一种方法来设置_id和版本以后从一个在Entity上运行的泛型方法,因为我必须在所有实体上共享这种行为,并希望避免写下数百次;-)。我希望能够
def createID(entity: Entity): Entity = {
entity.copy(_id = ..., version = ...)
}
...但当然这不会编译,因为实体没有复制方法。它是由编译器为每个单个案例类生成的......
在scala中实现此目的的最佳方法是什么?
为了防止有人问:我必须使用案例类,因为这是第三方库从我获得的请求中提取给我的,案例类实例是稍后序列化回BSON / MongoDB的。 ..
答案 0 :(得分:2)
确实,人们可以找到一种方法来实现
这样的事情Create common trait for all case classes supporting copy(id=newId) method
但由于我的用例非常复杂,我宁愿只创建两个新类
class MongoId(var id : BSONObjectID = null) {
def generate = {
id = BSONObjectID.generate
}
}
class MongoVersion(var version: Long = 0) {
def update = {
version = System.currentTimeMillis
}
}
并在那里实现了关于这些字段的共享行为。当然,您必须相应地更改基类的定义:
abstract class Entity {
def _id: MongoId
def version: MongoVersion
}
说清楚:只有当您想要在多个案例类中共享的行为仅影响(在我的情况下更改)一个属性时,此方法才有效...
答案 1 :(得分:0)
实施特质会有效吗?
trait MongoIdHandler {
def createId(entity : Entity) : Option[BSONObjectID] = { ..}
def setVersion(version : String) : Unit = { ..}
}
case class Person (..) with MongoIdHandler ..
如果任何实例需要id生成器的专用版本,则可以覆盖该特征提供的“default”impl。