2017-10-19 59 views
3

目前我有一种方法,接受ModelA并知道对它执行操作。斯卡拉的最佳做法是什么将有一种方法接受两种不同的模型

因此,在我的控制器中,我接受ModelA的请求并使用它调用此方法。

现在,我想能够接受ModelB的请求,将请求映射为ModelA(导致它具有相同的数据,而不是全部和不同的名称),并调用此方法。

可以说,该方法将如下所示:

def myMethod(data: ModelA): ResModel = { 
    // do something with data 
} 

我控制器currrently是:

def doActions(): Action[JValue] = { request => 
    val dataExctracted = request.body.extract[ModelA] 
    myMethod(dataExctracted) 
    ... 
} 

和我的两个型号都是在单独的文件只是case类:

case class ModelA(a: String, b: String, c: String) 

case class ModelB(aAsDifferentName: String, bAsDifferntName: String) 

Scala的最佳实践是让myMethod接受两种模型(没有Either)?以及控制器应该如何反应?

是否还有一种经典的方式来返回不同的模型,而不必接受不同控制器方法中的调用?

谢谢!

+2

让他们实现一个虚拟特质并对类型进行模式匹配。 –

+1

你如何决定从request.body中提取什么类型? – laughedelic

回答

-1

您可以尝试建立联合类型的模型(如Dotty中的Int | String)。

事情是这样的:

scala> case class Or[A, B](a: A, b: B) 
defined class Or 

scala> def test(v: Int Or String): String = { 
    | v.toString 
    | } 
test: (v: Or[Int,String])String 

scala> implicit def Int2Or(x: Int): Int Or String = Or(x, "") 
Int2Or: (x: Int)Or[Int,String] 

scala> implicit def String2Or(x: String): Int Or String = Or(-1, x) 
String2Or: (x: String)Or[Int,String] 

scala> test(1) 
res0: String = Or(1,) 

scala> test("") 
res1: String = Or(-1,) 

很酷的事情是,你可以使用Or类这样String Or Boolean,但是这绝对不是从斑点狗真正联合类型。

在我看来,海峡前沿的解决方案是使用密封的特质并进行模式匹配。

+0

问题是你怎么知道'Or(-1,“)是什么?案例类是一种产品类型,当我们想要的是一个联合类型(密封特质)。直接的解决方案是既不做也不使用不同的路线! :p –

+1

@AndyHayden好点!当然,正如我所说,更简单的解决方案是使用特质或甚至重载的方法。 – leshkin

+0

这只是使用'Either'的改进? OP表示他们不想使用'Either',但是你的'Or'只是用另一个名字'Either',除了(正如Andy所指出的)错误实施的情况。 –

相关问题