2013-06-13 2 views
0

Я использую платформу Slick в своем приложении Scala для подкачки. Для этой структуры требуется наличие ExtendedProfile.simple._ во всех объектах DDL. На данный момент у меня это определяется какОтметить объект как требующий некоторых аннотаций типа «self-type»

trait DatabaseProvider { 
    val profile : ExtendedProfile 
} 


trait PersistUser { 
    this : DatabaseProvider => 

    import profile.simple._ 

    object Users extends Table[(String, String, Boolean)]("user") { 
     // various definitions are here 
    } 
} 

, что я хочу, чтобы переместить объект пользователей вне признака, так что я могу использовать его отдельно в различных черт, как, что для таблицы присоединения. Но я не знаю, как я могу заставить объект Users зависеть от наличия DatabaseProvider в области видимости и импортировать все необходимые материалы.

Прошу совета.

+0

Я не 100%, что вы хотели бы сделать. Не могли бы вы привести пример того, что вы хотите сделать, и не работает? Мне кажется, что на данный момент вы можете передать конкретный «DatabaseProvider», который вам нужен для объекта «Пользователи». – gzm0

+0

В основном я хочу отделить объекты DDL, такие как Пользователь, и вывести их из черты, поэтому я могу использовать их в одиночку. – jdevelop

+0

Что мешает вам помещать 'Пользователи' вне черты? – gzm0

ответ

1

Вы могли бы что-то вроде этого, хотя я не уверен, что это 100%, что вы пытаетесь сделать , Идея здесь заключается в том, что вы можете сначала определить общую схему со всеми вашими определениями таблиц, которые не будут отличаться между различными провайдерами db. Затем вы можете расширить этот провайдер на db, который хотите поддержать, настроив фактические определения таблиц object, которые нужны slick. Это даст вам гибкость для более точного определения ExtendedProfile, который, я считаю, является тем, к чему вы стремитесь. Я знаю, что это компилируется, но я не пытался его запускать. Думаю, я оставлю это до вас.

import scala.slick.driver.ExtendedProfile 
import scala.slick.session.Session 

abstract class Schema(val profile:ExtendedProfile){ 
    import profile.simple._ 

    abstract class UsersModel extends Table[(String, String, Boolean)]("user") { 
    def name = column[String]("name", O.PrimaryKey) 
    def email = column[String]("email") 
    def valid = column[Boolean]("valid") 
    def * = name ~ email ~ valid 
    } 

    val Users:UsersModel 
} 

object MySqlSchema extends Schema(scala.slick.driver.MySQLDriver){ 
    object MySqlUsers extends UsersModel 

    val Users:UsersModel = MySqlUsers 
} 

class UserDAO(schema:Schema)(implicit sess:Session){ 
    import schema.profile.Implicit._ 

    def findAllUsers = { 
    val q = for(u <- schema.Users) yield u 
    q.list 
    } 
} 
+0

спасибо! что выглядит очень многообещающим и гибким. – jdevelop

0

вместо объекта, сделать его class Users(dbProvider: DatabaseProvider) extends Table ... или дать ему такое же чувство собственного типа, как PersistUser

+0

это должен быть объект, а не класс – jdevelop

+0

, почему он должен быть объектом? вы по существу хотите параметризовать эту вещь на DatabaseProvider * как-то *, но объект нельзя параметризовать. Вы обошли это раньше, поставив его в экземпляр признака, который параметризуется на этом DatabaseProvider. Если вы хотите, чтобы он жил вне этого, его нужно будет параметризовать на DatabaseProvider каким-либо другим способом. – stew

+1

@stew Я думаю, что ORM требует, чтобы это был объект. Вероятно, иметь названный одноэлементный тип. – gzm0

Смежные вопросы