使用在How to mix-in a trait to instance列出的解决方案,回答了这个问题(和我的问题也几乎是完全一样你的)。我们希望在不修改它(或为此事发电机)延长斯利克模型生成的代码
这里适合自我封闭,方便性和具体使用情况我了。这是我的油滑的代码生成器生成的代码:
/** 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
油滑的数据模型来实现be.objectify.deadbolt.java.models.Subject
Java接口,所以我可以用Deadbolt2我的斯卡拉剧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
}
请注意,我没有测试它尚未(但我会很快)
哇,你找到了解决办法。诚然!不是很漂亮,但哎! code-gen只是运行天堂,并得到你的干净的Scala数据模型。这就是说。我认为可能有一种方法可以在Scala中做到这一点。我正在检查,因为我有一个类似的用例,可以在不更改代码的情况下为某个类动态添加功能。 –