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中创造出与众不同的东西.
即使我现在明白它是如何运作的,我也无法理解这种设计的理由,至少在我看来,这种设计打破了最不惊讶的规则.有人可以指出任何优势,或者解释为什么可以做出这样的设计决定?
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"对象,当您想要访问会话特定数据时,必须使用该对象.不是很方便.
| 归档时间: |
|
| 查看次数: |
129 次 |
| 最近记录: |