2017-01-22 42 views
1

我有一個語言模型,表和存儲庫。到目前爲止,這工作:與通用存儲庫方法苦苦掙扎

package repositories 

import javax.inject.Inject 

import Helper 
import model.{Language, LanguageModel} 
import play.api.Logger 
import play.api.cache.SyncCacheApi 
import slick.jdbc.JdbcProfile 

import scala.concurrent.{ExecutionContext, Future} 
import scala.util.{Failure, Success} 

class LanguageRepository @Inject()(cache: SyncCacheApi, jdbcProfile: JdbcProfile, implicit val executionContext: ExecutionContext) 
{ 
    private val model = new LanguageModel(jdbcProfile) 

    import jdbcProfile.api._ 

    def all(userName: String): Future[Seq[Language]] = 
    { 
    cache.get[Future[Seq[Language]]](buildCacheKey(userName)) match 
    { 
     case Some(x) => {Logger.info("[LanguageRepository](all) Found something in cache"); x} 
     case None => { 
     Logger.info("[LanguageRepository](all) Nothing useful to be found in cache, calling database now") 
     val result = retrieve(userName) 
     result.onComplete{ 
      case Success(value) => if(!value.isEmpty) cache.set(buildCacheKey(userName), result) 
      case Failure(e) =>() 
     } 

     result 
     } 
    } 
    } 

    private def retrieve(userName: String): Future[Seq[Language]] = 
    { 
    // TODO extract this to a repositoryTrait and implement fallbacks etc 
    val db = Database.forURL(Helper.getDbUrl(), driver = Helper.getDbDriver()) 

    db.run(model.all.result) 
    } 

    private def buildCacheKey(userName: String): String = s"$userName.languages" 
} 

現在我掙扎在今天的過去我離開當前我。

所以我創建了這個特徵,並希望讓它被LanguageRepository擴展來擺脫對所有存儲庫/模型都應該相同的通用檢索方法。但遺憾的是至今沒有運氣:

trait Repository 
{ 
    type Entity 
    val model: Base 
    val profile: JdbcProfile 

    import profile.api._ 

    protected def retrieve(userName: String): Future[Seq[Entity]] = 
    { 
    val db = Database.forURL(Helper.getDbUrl(), driver = Helper.getDbDriver())  
    db.run(model.all.result) 
    } 
} 

這是基礎:

trait Base 
{ 
    val dbProfile: JdbcProfile 
    import dbProfile.api._ 

    type Entity 
    type EntityTable <: Table[Entity] 
    lazy val all = TableQuery[EntityTable] 
} 

在這裏,我需要得到一個錯誤>>類的類型,但Base.this.EntityTable發現

class LanguageModel(databaseProfile: JdbcProfile) extends Base 
    { 
    override val dbProfile: JdbcProfile = databaseProfile 
    import dbProfile.api._ 

    ... 

    override type EntityTable = LanguageTable 
    } 

庫本身也沒有編譯,因爲類型不匹配。有多個問題,我不知道從哪裏開始解決它們。

回答

1

您的基表定義不會像那樣工作。你需要類的類型,也許你應該泛型。此外,不是創建多個抽象,而是從一個抽象開始,並從那裏進化。嘗試沿着這些線:

class Repository[A, B <: Table[A]](t: TableQuery[B]) { 
    val model = t 
    //protected def retrieve .. 
} 

class LanguageModel(databaseProfile: JdbcProfile) extends Repository[Language, LanguageTable](TableQuery[LanguageTable]) { 
    //... 
} 

獲取一切首先編譯,然後開始一次添加一個類的抽象。

+0

該模型雖然沒有存儲庫 – Sorona

相關問題