根据请求参数

时间:2016-01-20 13:55:24

标签: scala

我的情况类似于下面的情况,如果请求来自UI,则必须首先验证请求,然后再执行任何其他操作。但是,如果请求未从用户界面提交 - 但请通过EDI提交 - >在这种情况下,有一些商业需求如何儿童数据" id"在持久化父数据并将父数据id用于子数据部分后,在请求中填充。这个细节对于这个问题并不重要。

为了for理解中改变方法调用的顺序,我有类似于下面的东西,看起来有点重复和非惯用。有没有更好的方法来实现这一目标?

def persistData(req : Request) = {
req.actionFromUI match{
  case Some(_) => for{
     validatedReq <- validateRequest(req) //1st thing
     transformedReq <- transformRequest(validatedReq)
     persitedReq <- persistRequestData(transformedReq)
  }
  case None => for{
    transformedReq <- transformRequest(validatedReq)
    persitedReq <- persistRequestData(transformedReq)
    validatedReq <- validateRequest(persitedReq) //last thing
  }
}

}

2 个答案:

答案 0 :(得分:1)

如下:

def persistData(req : Request) = {
 val (c1, c2, c3) = req.actionFromUI match{
  case Some(_) => (validateRequest(req), 
                   transformRequest(validatedReq),
                   persistRequestData(transformedReq))
  case _ => (transformRequest(validatedReq),
             persistRequestData(transformedReq), 
             validateRequest(persitedReq))
 }
 for {
    f1 <- c1
    f2 <- c2
    f3 <- c3
 } // .. do something here with f1, f2, f3
}

答案 1 :(得分:0)

这样的事情可能(假设你的validateRequest返回Option[Request])?

val (preValidate, postValidate) = req.actionFromUI match {
   case Some(_) => (validateRequest _,  Option[Request].apply _)
   case _ => (Option[Request].apply _, validateRequest _)
}

for {
   pre <- preValidate(req)
   transformed <- transformRequest(pre)
   persisted <- persistRequest(transformed)
   post <- postValidate(persisted)
}

或者

def validateRequest(req: Request, pre: Boolean) = 
  if(req.actionFromUI.isDefined == pre) validateRequest(req) else Some(req)

for {
   pre <- validateRequest(req, true)
   transformed <- transformRequest(pre)
   persisted <- persistRequest(transformed)
   post <- validateRequest(persisted, false)
}