我有一个Play 2.3项目,其中包含来自AJAX的自定义标头,需要传递给每个服务调用(进一步传递给Web服务)。我想把它变成一个隐含的参数,比如在这个愚蠢的例子中:
case class CriteriaHeaders(license: String)
case class Criteria(criteriaHeaders: CriteriaHeaders, id: Int)
class ProjectController(service: Service) {
implicit def criteriaToCiteriaHeaders(criteria: Criteria): CriteriaHeaders = criteria.criteriaHeaders
def findName(criteria: Criteria) = {
// implicit val criteriaHeaders: CriteriaHeaders = criteria.criteriaHeaders
service
.findName(criteria.id)
.fold(
error => error,
name => name
)
}
}
class Service {
def findName(id: Int)
(implicit criteriaHeaders: CriteriaHeaders): Either[String, String] = ??? // TODO
}
(当然在实际项目中有一个ActionBuilder,一个Json解析器等。)
用法:
val controller = new ProjectController(new Service())
val name = controller.findName(Criteria(CriteriaHeaders("abc"), 123))
它没有编译,给出错误:
Error:(21, 17) could not find implicit value for parameter licenseHeaders: A$A172.this.CriteriaHeaders.findName(criteria.id)
但是,如果我取消注释隐式val,它就可以工作。为什么它不能使用隐式方法?
编辑: 如果有人发现这个有用,我从@ till-rohrmann那里得到了第二个建议,我把它隐含在CriteriaHeaders的伴随对象中,所以每个使用它的控制器都可以使用它。
object CriteriaHeaders {
implicit def criteriaToCiteriaHeaders(implicit criteria: Criteria) = criteria.criteriaHeaders
}