私は、プレイフレームワーク上に構築されたWebアプリケーションを持っています。コンフィグレーションマップのスカラークラス名
私のエンドポイントの1つは、異なるクラスの出力で構成された応答を提供します。消費者は、応答の中でどのような出力をしたいかを選択することができます: GET /model/:modelId?fields=length,width,age
。 したがって、私はLengthProvider
,WidthProvider
を持っています。 今、私は、問題が発生
fields.collect {
case field if providers.contains(field) => providers(field)(db).get(modelId)
}
のように、このマップにより、消費者の入力をフィルタリングし、すべてのプロバイダを適用することができるように
val providers = Map(
"length" -> LengthProvider,
"width" -> WidthProvider
)
のように、コントローラで構成マップを持つようにしたいです私は対応するクラスを構築しようとします。
abstract class FieldProvider(db: DB) {
def get(modelId: Long): Future[Seq[Writes]]
}
と、対応する実装(LengthProvider
、WidthProvider
): 私は抽象FieldProvider
を持っています。ここで設定マップをコンパイルするには、参照したいクラスのコンパニオンオブジェクトを定義する必要があります(例えば、LengthProvider
オブジェクトが必要です)。そして、私はマップ(クラス名)の値を使用するとき、私は通常のようにクラスインスタンスを初期化することはできません、私は唯一のオブジェクトに定義されたapply
メソッドへのアクセス権があります。しかし、問題は、これは私が定義する抽象クラスの一部ではないため、コンパイラはapply
メソッドのシグネチャを理解できません(サブクラスのコンパニオンオブジェクトでのみ定義され、親抽象クラスでは定義されていないため)。
fields.collect {
case field if providers.contains(field) => providers(field)(db).get(modelId)
↑ won't compile
}
コンパニオンオブジェクトのapply
署名を抽象クラスの一部にする方法はありますか?あるいは、もう一つ、より良いアプローチがありますか?
から継承するコンパニオンを聞かせてクーロン!今、私は、実際には、LengthProviderに暗黙の引数も必要であるという問題があります。コンパニオンオブジェクトでこの 'apply'メソッドを通して何とかそれを転送できますか? –