【发布时间】:2016-08-03 07:43:34
【问题描述】:
我有以下抽象类:
abstract class FieldProvider[+T: Writes](db: DB)(implicit i: RequestAction, j: ExecutionContext) {}
以及以下实现:
class LengthProvider extends FieldProvider ...
object LengthProvider extends ((DB) => LengthProvider) {
def apply(v1: DB): LengthProvider = new LengthProvider(v1)
}
class WidthProvider extends FieldProvider ...
object WidthProvider extends ((DB) => WidthProvider) {
def apply(v1: DB): WidthProvider = new WidthProvider(v1)
}
我之所以有这些apply 方法是因为我需要以下配置图:
val providers: Map[String, ((DB) => FieldProvider)] = Map(
"length" -> LengthProvider,
"width" -> WidthProvider
)
这样我就可以通过包含其名称的字符串来初始化提供者:
providers("length")(db) // returns a new instance of LengthProvider
现在,我的问题是所有这些提供者构造函数都需要两个隐式变量。但我不知道如何将其包含在函数定义(DB) => FieldProvider 中。所以,本质上,apply 方法签名应该类似于(DB)(implicit RequestAction, ExecutionContext) => FieldProvider,但我不知道我正在尝试做的事情是否有正确的语法。
我也可以放弃并明确通过:
object WidthProvider extends ((DB, RequestAction, ExecutionContext) => WidthProvider) {
def apply(v1: DB, v2: RequestAction, v3: ExecutionContext): WidthProvider = new WidthProvider(v1)(v2,v3)
}
但是我必须在其他地方明确地传递它们,而不是providers("length")(db),我必须写providers("length")(db, implicitly[RequestAction], implicitly[ExecutionContext]),这感觉不对。
【问题讨论】:
-
您将需要隐式的东西移到较低的范围内,在
LengthProvider实现中。您不必将它们作为构造函数参数,而是执行每个方法的方法。 -
嗯,这有帮助。随意发布它作为答案,我会接受它。
-
底层代码确实是一样的,只是问题不同,提出的解决方案也不同。
标签: scala playframework playframework-2.0 scala-implicits