如何在我的应用程序流程中有效地构建复杂案例 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)
我有一个控制器方法可以将客户端的请求提取到 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)