我有以下抽象类:
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])
,这感觉不对。