2017-01-22 5 views
1

私は言語モデル、テーブル、リポジトリを持っています。これまでのところ、これは動作します:一般的なリポジトリメソッドで悩む

今私は過去の私と闘っています。

私はこの特性を作成し、すべてのリポジトリ/モデルで同じでなければならない一般的な検索方法を取り除くために、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

ベーステーブルの定義は、そのようには機能しません。クラスの型が必要ですが、代わりにジェネリックスを使用する必要があります。また、複数の抽象化を作成するのではなく、抽象化を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

関連する問題