2017-03-31 6 views
0

クライアントからのリクエストをModelOneに抽出するコントローラーメソッドがあります。このモデルを変更してより大きなモデルにする必要があります。ModelTwoと呼びます。別のサービスに送信できます。私のアプリフローで複雑なケースクラスを効率的に構築する方法はありますか?

これはModelOneケースクラスです:

case class ModelOne(list: List[String], expectedListSize: Int) 

そして、これはModelTwoケースクラスである:私はからの要求を取得するたび

case class ModelTwo(modelThree: Option[ModelThree]) 

case class ModelThree(status: Status(its enum), 
             list: List[String], 
             amount: Option[Int], 
             message: Option[String]) 

だから、私は現在、それを構築するためにやっていることですモデムからlistプロパティを取得してModelTwoを構築する必要があるため、構築するメソッドを持つサービスを呼び出します。

def buildModelTwoResponse(modelOne: ModelOne): ModelTwo = { 
    ModelTwo(Some(ModelThree(Status.Done, modelOne.list, None, None))) 
} 

ので、私は行くコントローラで:

val modelOne = request.body.extractOpt[ModelOne] 

val modelTwo = myService.buildModelTwoResponse(modelOne) 

これを行うにはよりエレガントな方法はありますか?

答えて

0

よりエレガントな方法はapply機能を定義することによって、そのコンパニオンオブジェクトでごModelTwoタイプのための第二のコンストラクタを定義するには、次のようになります。

case class ModelTwo(modelThree: Option[ModelThree]) 

// Add this 
object ModelTwo { 

    // Move your service function logic to here 
    def apply(modelOne: ModelOne): ModelTwo = { 
    ModelTwo(Some(ModelThree(Status.Done, modelOne.list, None, None))) 
    } 
} 

それからもはやあなたのサービス機能を必要としないので、これをする代わりに:

// You don't need this 
val modelTwo = myService.buildModelTwoResponse(modelOne) 

これは可能です:

val modelTwo = ModelTwo(modelOne) 
0

どのようなものについて:

case class ModelOne(list: List[String], expectedListSize: Int) { 
object ModelOne { 
    buildResponse(modelOne: ModelOne): ModelTwo { 
     ModelTwo.fromModelOne(modelOne) 
    } 
} 

case class ModelTwo(modelThree: Option[ModelThree]) 
object ModelTwo { 
    def fromModelOne(modelOne: ModelOne): ModelTwo = { 
     fromModelThree(ModelThree.fromModelOne(modelOne)) 
    } 

    def fromModelThree(modelThree: ModelThree): ModelTwo = { 
     ModelTwo(Some(modelThree)) 
    } 
} 

case class ModelThree(status: Status(its enum), 
            list: List[String], 
            amount: Option[Int], 
            message: Option[String]) 
object ModelThree { 
    def fromModelOne(status: Status, modelOne: ModelOne): ModelThree = { 
     ModelThree(status, modelOne.list, None, None) 
    } 
} 
関連する問題