配置映射中的 scala class 个名称
scala class names in configuration map
我有一个基于 play 框架的网络应用程序。
我的一个端点提供了由不同 classes 的输出组成的响应。消费者可以选择他希望在响应中包含哪些输出:
GET /model/:modelId?fields=length,width,age
。
因此,我有LengthProvider
、WidthProvider
。
现在,我想在控制器中有一个配置映射,比如
val providers = Map(
"length" -> LengthProvider,
"width" -> WidthProvider
)
能够通过此地图过滤消费者的输入并应用所有提供者,例如
fields.collect {
case field if providers.contains(field) => providers(field)(db).get(modelId)
}
当我尝试构建相应的 classes 时出现问题。
我有一个摘要 FieldProvider
:
abstract class FieldProvider(db: DB) {
def get(modelId: Long): Future[Seq[Writes]]
}
和相应的实现(LengthProvider
、WidthProvider
)。现在,为了编译配置 Map,我需要为我想引用的 classes 定义伴随对象(例如,我需要 LengthProvider
对象)。然后,当我使用 Map 的值(class 名称)时,我无法像通常那样初始化 class 实例,我只能访问在中定义的 apply
方法伴生对象。但问题是这不是我定义的抽象 class 的一部分,所以编译器不理解 apply
方法签名(因为它只定义在 subclasses'伴生对象,不在父抽象中 class):
fields.collect {
case field if providers.contains(field) => providers(field)(db).get(modelId)
↑ won't compile
}
有没有办法使伴生对象的 apply
签名成为摘要 class 的一部分?或者还有其他更好的方法吗?
由于地图中的实例实际上是伴随对象,因此您可以让伴随对象继承自 Function1,例如:
object LengthProvider extends ((DB) => LengthProvider) {
def apply(v1: DB): LengthProvider = new LengthProvider(v1)
}
object WidthProvider extends ((DB) => WidthProvider) {
def apply(v1: DB): WidthProvider = new WidthProvider(v1)
}
val providers: Map[String, ((DB) => FieldProvider)] = Map(
"length" -> LengthProvider,
"width" -> WidthProvider
)
我有一个基于 play 框架的网络应用程序。
我的一个端点提供了由不同 classes 的输出组成的响应。消费者可以选择他希望在响应中包含哪些输出:
GET /model/:modelId?fields=length,width,age
。
因此,我有LengthProvider
、WidthProvider
。
现在,我想在控制器中有一个配置映射,比如
val providers = Map(
"length" -> LengthProvider,
"width" -> WidthProvider
)
能够通过此地图过滤消费者的输入并应用所有提供者,例如
fields.collect {
case field if providers.contains(field) => providers(field)(db).get(modelId)
}
当我尝试构建相应的 classes 时出现问题。
我有一个摘要 FieldProvider
:
abstract class FieldProvider(db: DB) {
def get(modelId: Long): Future[Seq[Writes]]
}
和相应的实现(LengthProvider
、WidthProvider
)。现在,为了编译配置 Map,我需要为我想引用的 classes 定义伴随对象(例如,我需要 LengthProvider
对象)。然后,当我使用 Map 的值(class 名称)时,我无法像通常那样初始化 class 实例,我只能访问在中定义的 apply
方法伴生对象。但问题是这不是我定义的抽象 class 的一部分,所以编译器不理解 apply
方法签名(因为它只定义在 subclasses'伴生对象,不在父抽象中 class):
fields.collect {
case field if providers.contains(field) => providers(field)(db).get(modelId)
↑ won't compile
}
有没有办法使伴生对象的 apply
签名成为摘要 class 的一部分?或者还有其他更好的方法吗?
由于地图中的实例实际上是伴随对象,因此您可以让伴随对象继承自 Function1,例如:
object LengthProvider extends ((DB) => LengthProvider) {
def apply(v1: DB): LengthProvider = new LengthProvider(v1)
}
object WidthProvider extends ((DB) => WidthProvider) {
def apply(v1: DB): WidthProvider = new WidthProvider(v1)
}
val providers: Map[String, ((DB) => FieldProvider)] = Map(
"length" -> LengthProvider,
"width" -> WidthProvider
)