How to mix-in a trait to instanceで概説されている解決策を使用して、この質問に答えます (そして私の質問もあなたのものとほぼ同じです)。Slickモデルで生成されたコードを変更せずに拡張したい(またはジェネレーター)
自己完結型、利便性、および私が持っていた特定のユースケースに合わせてここに適応しました。これは私の Slick code-gen 生成コードです:
/** 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") { ... }
しかし、 Deadbolt2を Scala Play Web アプリケーションの一部として使用できるように、Java インターフェースUser
を実装するために Slick データ モデルが必要です。be.objectify.deadbolt.java.models.Subject
したがって、私は次のようにします:
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
}
まだテストしていないことに注意してください(ただし、すぐにテストします)