为什么使用单例实现Lift中的SessionVars?

Mic*_*ski 1 scala session-variables lift

在Lift管理状态的一种典型方法是创建一个扩展SessionVar的单例对象,就像这个例子中的文档一样:

object MySnippetCompanion {
  object mySessionVar extends SessionVar[String]("hello")
}
Run Code Online (Sandbox Code Playgroud)

使用SessionVars 的情况很清楚,我已经根据需要在实践中使用它们.我也大致了解它们是如何在里面工作的.

尽管如此,我还是不禁想知道为什么"会话变量"的机制与当前会话明显相关(通常只是系统中许多会话中的一个),设计为通过单例使用?这与我的直觉object相反,乍看之下我很想相信Lift能够以某种方式覆盖Scala的语言特征,并在常规Scala中创造出与众不同的东西.

即使我现在明白它是如何运作的,我也无法理解这种设计的理由,至少在我看来,这种设计打破了最不惊讶的规则.有人可以指出任何优势,或者解释为什么可以做出这样的设计决定?

gzm*_*zm0 5

Lift中的会话变量使用Scala DynamicVariable.基本上它们允许您静态引用代码块中的变量,然后调用代码并替换值:

import scala.util.DynamicVariable

val x = new DynamicVariable(1)

def printIt() {
  println(x.value)
}

printIt()
//> 1

x.withValue(2)(printIt())
//> 2
Run Code Online (Sandbox Code Playgroud)

因此,一个请求处理每一次,这些动态变量的范围更改为当前会话,完全隐藏当前会话的状态变化到你作为一个程序员.

另一种选择是传递一个"sessionID"对象,当您想要访问会话特定数据时,必须使用该对象.不是很方便.