如何在我的应用程序流程中有效地构建复杂案例 class?

how to efficiently build up complex case class in my app flow?

我有一个控制器方法可以将客户端的请求提取到 ModelOne,我需要更改此模型并将其构建为更大的模型,我们称之为 ModelTwo 所以我可以将其发送到其他服务。

这是 ModelOne 案例 class:

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

这是 ModelTwo 案例 class:

case class ModelTwo(modelThree: Option[ModelThree])

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

所以我目前正在做的构建它的是,每当我从控制器中的客户端收到请求时,我都会调用一个服务,该服务具有构建它的方法,因为我需要接受 list 属性 从 ModelOne 构建 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)

有没有更优雅的方法来做到这一点?

怎么样:

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)
   }
}

一种更优雅的方法是通过定义 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)