2014-02-28 41 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 
} 

或者你可以让这个特质成为一个类并采取一个私人的参数。