使用How to mix-in a trait to instance 中概述的解决方案,可以回答这个问题(我的问题也几乎和你的一样)。我们想扩展 Slick 模型生成的代码而不修改它(或就此而言,生成器)
在这里进行了调整,以实现自包含、方便和我拥有的特定用例。这是我的 Slick 代码生成代码:
/** Table description of table user. Objects of this class serve as prototypes for rows in queries. */
class User(_tableTag: Tag) extends Table[UserRow](_tableTag, "user") { ... }
但我需要我的User
Slick 数据模型来实现be.objectify.deadbolt.java.models.Subject
Java 接口,以便我可以使用Deadbolt2作为我的 Scala Play Web 应用程序的一部分。
因此我会这样做:
import be.objectify.deadbolt.java.models.Subject
/**
* Mixin framework or infrastructural code
*/
trait DynamicMixinCompanion[TT] {
implicit def baseObject[OT](o: Mixin[OT]): OT = o.obj
def ::[OT](o: OT): Mixin[OT] with TT
class Mixin[OT] protected[DynamicMixinCompanion](val obj: OT)
}
/**
* Subject Mixin implementation
*/
object SubjectMixinHelper extends DynamicMixinCompanion[Subject] {
def ::[T](o: T) = new Mixin(o) with Subject {
def getPermissions = ...
def getRoles = ...
}
}
最后:
import SubjectMixinHelper._
withSession{ implicit session =>
val user = Query(User).where(_.id === id).firstOption :: Subject
// then use user as a Subject too
user.getPermissions
user.getRoles
}
请注意,我还没有测试它(但我很快就会)