2016-10-16 3 views
0

Я хотел бы получить соединение с экземпляром базы данных, которые я определяю, когда я пишу это в application.conf:Play: получение соединения с базой данных по умолчанию

db.default { 
    driver = "com.mysql.jdbc.Driver" 
    url = "jdbc:mysql://localhost/test" 
    username = ... 
    password = ... 
} 

docs говорят, что мы должны вставьте db: Database в контроллер (который отлично работает), и не показывает другого способа. Предопределенная инъекция Guice для этого скрыта (не в Module.scala). Также он предполагает, что стандартный синглтон Database автоматически создается в Play.

Что делать, если я не хочу, чтобы ввести базу данных в контроллер, но отдельные проблемы и использовать его только в некоторых SqlHandler объект, который только работа заключается в том, чтобы делать запросы SQL:

object SqlHandler { 
    val db: Database = ??? 
    def select(params) {...db...} 
    def insert(params) {...db...} 
} 

Я знаю, что я может создать новый экземпляр базы данных с play.api.db.Databases с чем-то вроде

import play.api.db.Databases 
val db: Database = Databases(
    driver = "com.mysql.jdbc.Driver" 
    url = "jdbc:mysql://localhost/test" 
    username = ... 
    password = ... 
) 

, но я не только найти глупо повторять всю информацию, я считаю, что это также создает базу данных дважды (один раз автоматически, как только здесь вручную, не Это?).

Есть ли какой-либо удобный способ для подключения к моей базе данных по умолчанию, или как Могу ли я использовать Guice для инъекции в другом месте?

ответ

1

Этот ответ предполагает, что вы хотите ввести свой SqlHandler в контроллер.

Если да, то вы можете просто сделать это в вашем контроллере: -

class Application @Inject() (sql: SqlHandler) extends Controller { 

    def index = Action { implicit request => 
    ...  
    sql.someSQLHandlerBehaviour() 
    ... 
    } 
} 

Поскольку контроллеры управляются Guice вне коробки, любые инъекционные также подпадают под сферу жизни-Guice в управление циклами. Поэтому вы должны просто ввести ваш SqlHandler в контроллер, как указано выше.

И так как ваш SqlHandler теперь находится под управлением Guice, вы можете ввести jdbc зависимостей в SqlHandler, как это.

@Singleton 
class SqlInjector @Inject() (db: Database) { ... } 
+0

Извините, что я действительно все еще не понимаю. Это 'SqlHandler', что я хочу использовать db in, а не какой-то новый' DBTest'. – JulienD

+0

Привет, это был просто пример. Я редактировал свой пост, хотя для ясности. Важный бит заключается в том, что вы (A) понимаете, что вы можете вставлять зависимости где угодно, пока инжектор и инъецируемый управляются Guice. (B) Если вам нужен только один экземпляр, вы можете использовать '@ Singleton' в классе, а не пытаться вставлять в« объект », что потребует больше пробега. – Nio

+0

Хорошо. И теперь я должен ввести SqlHandler (где угодно) вместо базы данных, правильно? Если я просто делаю «новый SqlHandler», он жалуется, что для него требуется параметр базы данных. – JulienD

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