2014-07-12 2 views
0

서비스 API에서 다음과 같은 작업을 수행하여 Slick 트랜잭션을 만드는 것처럼 보입니다. 작은 DSL 찾기 기능 만들기

db.withTransaction{ implicit session => 
    ..... 
} 

뭔가 더 DSL 대신 사방 db.withTransaction을하는 니펫을 찾고를 만들려고합니다.

나는 지금은

executeInSlickTransaction{ 
.... 
} 

를 호출 할 수 있습니다하지만 내가 executeInSlickTransaction 예에서뿐만 아니라 implicit session 필요 그래서 아래

def executeInSlickTransaction[T](body: => T) = { 
val db = DataSource.getDb 
    db.withTransaction{ implicit session => 
    body 
    } 

} 

함께했다

executeInSlickTransaction{ implicit session => ...}session은 기대하는 DAO 호출 (executeInSlickTransaction 블록에서 작성)에 암시 적으로 필요하기 때문입니다.

implicit sessionexecuteInSlickTransaction에서 다시 가져 오는 방법이 있습니까?

+0

메소드의 올바른 서명은''execute''SlickTransaction [T] (body : (Session) => T)'이어야하고'body (session)'를 호출해야합니다. 'body' 함수에서'Session'을 암시 적으로 만들 수 있습니다 :'executeInSlickTransaction {implicit session => ...}' – wedens

답변

1

valdb 다른 곳에 저장할 수 있습니다. 그것은 단지 구성입니다.

세션을 암시 적으로 전달하려는 경우 암시 적 키워드를 제거 할 수 없습니다. 그러나 당신은 할 필요가 없습니다.

import db.withTransaction 

슬릭 2.0 :

withTransaction{ someQuery.list()(_) } 

슬릭 2.1 :

withTransaction{ someQuery.list(_) } 
당신은 단지 하나의 쿼리 (또는 단일 기능 세션 => 결과를) 실행하면 당신은 같은 것을 할 수 있습니다

또는 세션 변수의 이름을 줄여도됩니다. 실제로 암시적일지라도 중요하지 않습니다.

withTransaction{ implicit s => 
    someQuery.list()(_) 
} 

"dsl"이 마음에 들지 않는 것처럼 보입니다. 즉, 다른 방법이 도움이 될 수 있습니다. 기껏해야 당신은 somethind 할 수있는 이름을 단축 할 수 짧은 :

당신이 스칼라에 새로운 그들은 거의 모든 스칼라 책에서 설명되어야한다, 여기에 사용 된 몇 가지 개념을 이해하지 않지만, 물론 많이있는 경우
import db.{withTransaction => t} 

t{ implicit s => q.list } 

당신이 새로울 때 동시에 사물을