使用在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中做到這一點。我正在檢查,因爲我有一個類似的用例,可以在不更改代碼的情況下爲某個類動態添加功能。 –