2016-04-10 5 views
0

私は、プレイフレームワーク上に構築された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]] 
} 

と、対応する実装(LengthProviderWidthProvider): 私は抽象FieldProviderを持っています。ここで設定マップをコンパイルするには、参照したいクラスのコンパニオンオブジェクトを定義する必要があります(例えば、LengthProviderオブジェクトが必要です)。そして、私はマップ(クラス名)の値を使用するとき、私は通常のようにクラスインスタンスを初期化することはできません、私は唯一のオブジェクトに定義されたapplyメソッドへのアクセス権があります。しかし、問題は、これは私が定義する抽象クラスの一部ではないため、コンパイラはapplyメソッドのシグネチャを理解できません(サブクラスのコンパニオンオブジェクトでのみ定義され、親抽象クラスでは定義されていないため)。

fields.collect { 
    case field if providers.contains(field) => providers(field)(db).get(modelId) 
                   ↑ won't compile 
    } 

コンパニオンオブジェクトのapply署名を抽象クラスの一部にする方法はありますか?あるいは、もう一つ、より良いアプローチがありますか?

答えて

1

マップ内のインスタンスが実際にcompaionオブジェクトでwoudとして、あなたはこれがうまく働いていたオブジェクトが機能1:例えば

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 
) 
+0

から継承するコンパニオンを聞かせてクーロン!今、私は、実際には、LengthProviderに暗黙の引数も必要であるという問題があります。コンパニオンオブジェクトでこの 'apply'メソッドを通して何とかそれを転送できますか? –

関連する問題