2014-09-14 4 views
1

Mapper와 CRUDify를 사용하는 리프트 애플리케이션 (모델에 대해서는 아래 참조)에서 모델의 일부 중복을 제거하려고합니다. 다음과 같이 나는 반복 오브젝트 정의의 일부 클래스 멤버를 오버라이드 (override) :Mapper 모델에서 CRUDify 멤버 (사용자 모델에 액세스해야하는)의 재정의에 혼합 할 수있는 특성을 작성하려면 어떻게해야합니까?

override def showAllMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in")) 
override def createMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in")) 
다음과 같이 내가 형질에 혼합 할 수 있도록,이 돌봐 특성을하고 싶습니다

:

object Test1 extends Test1 with LongKeyedMetaMapper[Test1] with CRUDify[Long, Test1] with MyNewTrait { 
MyNewTrait 같은 것을 정의 할 것

:

trait MyNewTrait { 
    override def showAllMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in")) 
    override def createMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in")) 
} 

나는이 특성은 사용자 모델에 액세스해야 할 것 같아요. 누구든지 형질을 쓰는 방법에 대해 조언 할 수 있습니까? 위에 기술 된 것처럼, 특성은 불완전하다. 나는

/* ********************************************************************************************* */ 
object Test1 extends Test1 with LongKeyedMetaMapper[Test1] with CRUDify[Long, Test1] { 
    override def dbTableName = "test1" 
    override def fieldOrder = List(c1, c2, c3) 
    override def showAllMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in")) 
    override def createMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in")) 
} 
class Test1 extends LongKeyedMapper[Test1] with IdPK { 
    def getSingleton = Test1 
    object c1 extends MappedString(this, 50) 
    object c2 extends MappedString(this, 50) 
    object c3 extends MappedString(this, 50) 
} 
/* ********************************************************************************************* */ 
object Test1 extends Test1 with LongKeyedMetaMapper[Test1] with CRUDify[Long, Test1] { 
    override def dbTableName = "test2" 
    override def fieldOrder = List(c1, c2, c3) 
    override def showAllMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in")) 
    override def createMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in")) 
} 
class Test1 extends LongKeyedMapper[Test1] with IdPK { 
    def getSingleton = Test1 
    object c1 extends MappedString(this, 50) 
    object c2 extends MappedString(this, 50) 
    object c3 extends MappedString(this, 50) 
} 
+1

아마도 당신은 당신의 형질에 대한 의존성 주입과 같은 것이 필요할 것입니까? http://jonasboner.com/2008/10/06/real-world-scala-dependency-injection-di/ – Ashalynd

+1

@Ashalynd : Aleksey의 답변이 트릭을 만들었지 만 링크를 보내 주셔서 감사합니다. 특성 및 DI에 대한 정보는 다음과 같습니다. 유능한. –

답변

3

내가 코드를 확인하기 편리한 프로젝트가없는, trait MyNewTrait

감사 이후에 무엇을 넣어 알아낼 수 없습니다하지만이 작동합니다 :

trait MyNewTrait[KeyType, CrudType <: KeyedMapper[KeyType, CrudType]] 
extends CRUDify[KeyType, CrudType] { 
    self: CrudType with KeyedMetaMapper[KeyType, CrudType] => 

    override def showAllMenuLocParams: List[Loc.AnyLocParam] = 
     List(If(User.loggedIn_? _, "Not logged in")) 

    override def createMenuLocParams: List[Loc.AnyLocParam] = 
     List(If(User.loggedIn_? _, "Not logged in")) 
} 

당신이 할 수있는 나중에 CRUDify 형질 대신 혼합하십시오.

Long 키 유형을 사용하기 때문에 하나의 유형 매개 변수를 사용하지 않는 비슷한 방법으로 LongCRUDify을 확장 할 수도 있습니다.