我有简单的服务类
trait ItemService[+A] {
def getItem(id: Int): Option[A]
}
class MockItemService(implicit inj: Injector) extends ItemService[Item] with Injectable {
def getItem(id: Int) = {
Option(new Feature("My Headline",Author(2,"Barry White")))
}
}
使用scaldi im将MockItemService绑定到ItemService然后访问类似
class Features(implicit inj: Injector) extends Controller with Injectable {
val itemService = inject [ItemService[Item]]
def item(cat:String, id:Int, urlTitle:String) = Action {
itemService.getItem(id).map { item => Ok(views.html.feature.item(item))
}.getOrElse(NotFound)
}
}
我想要的是项目类型为Feature而不是Item。功能扩展了项目。
答案 0 :(得分:0)
class Features(implicit inj: Injector) extends Controller with Injectable {
val itemService = inject [ItemService[Item]]
def item(cat:String, id:Int, urlTitle:String) = Action {
itemService.getItem(id).map { item =>
item match {
case Feature(itsAFeature) => Ok(views.html.feature.item(itsAFeature))
case itsAnItem => ???
}
}.getOrElse(NotFound)
}
}
答案 1 :(得分:0)
我发现这很有用
itemService.getItem(id).map { item =>
item match {
case x: Feature => Ok(views.html.feature.item(x))
case _: Any => NotFound
}
}.getOrElse(NotFound)
它仍然感觉有点笨重。 我基本上希望getItem返回不同类型的对象,这些对象都是Item的子类型,但在某些时候我需要处理特定类型的对象。我可以做getFeature等,但在调用getItem之前我可能不知道类型。如果控制器不需要知道具体细节那么肯定是一个好主意它不会。