2014-02-28 42 views
0

我們有幾個使用數據庫會話進行初始化的特徵/類/案例類(我們在MySql上使用Slick,所以下面的所有Sessions都有類型scala.slick.session.Session)。正在初始化特徵的方法已經有了一個開放的數據庫會話,所以我希望能夠將這個特性傳遞給初始化時使用的特徵;但是,一旦特質初始化,會話將自動關閉,因此我不希望特質持續關閉對會話的引用,以消除我們不小心嘗試使用它的可能性。使用封閉的數據庫會話來初始化特徵

trait MyTrait { 
    private def initField1(implicit session: Session) = // init code 
    val field1 = db withSession { implicit sesssion: Session => initField1 } 
} 

def initMyTrait(implicit session: Session) = new MyTrait {} 

這是我的代碼目前的樣子 - 我無法找到通過initMyTrait的會話MyTrait的好辦法,所以我需要打開一個第二屆初始化MyTrait.field1。我可以做類似

trait MyTrait { 
    private val _session: Session 

    private def initField1(implicit session: Session) = // init code 
    val field1 = initField1(_session) 
} 

def initMyTrait(implicit session: Session) = new MyTrait { private val _session = session } 

但這將在MyTrait初始化

回答

1

後留下一個封閉的會議上,我會盡量避免需要初始化性狀數據庫連接。另一種選擇可以是你用來代替val的緩存方法,例如,

private var field1Cache: ... = null 
def field1(implicit session:Session) = { 
    if(field1Cache == null){ 
    field1Cache = initField1 
    } 
    field1Cache 
} 

或者你可以讓這個特質成爲一個類並採取一個私人的參數。