У меня есть следующий абстрактный класс:
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
. Вместо того, чтобы использовать их в качестве аргументов конструктора, вы используете подход для каждого метода. - person flavian   schedule 12.04.2016