我有一个控制器方法可以将客户端的请求提取到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])
所以我现在正在做的就是每当我从控制器中的客户端获得请求时,我就会调用一个具有构建方法的服务,因为我需要使用{{1}来自ModelOne的属性并构建ModelTwo,它看起来像这样:
list
所以在控制器中我去了:
def buildModelTwoResponse(modelOne: ModelOne): ModelTwo = {
ModelTwo(Some(ModelThree(Status.Done, modelOne.list, None, None)))
}
有更优雅的方法吗?
答案 0 :(得分: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)
}
}
答案 1 :(得分:0)
更优雅的方法是通过定义ModelTwo
函数为其伴随对象中的apply
类型定义第二个构造函数:
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)