0

私は単純なサービスクラスを持っています

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)    
  }  
}

私が欲しいのは、アイテムがアイテムではなく機能タイプであることです。機能はアイテムを拡張します。

4

2 に答える 2

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)
      }
    }
于 2014-08-08T06:27:22.627 に答える
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 を呼び出す前に型がわからない場合があります。コントローラーが詳細を知る必要がない場合は、そうしないことをお勧めします。

于 2014-08-09T20:31:38.263 に答える