Я работаю над Playframework2.5 с помощью play-slick и связанных с ним программ, таких как пакет.Создайте экземпляр класса, который делает DI через Playframework Guice Независимо в Scala
текущая структура проекта как
/rootPlayProject
/app
/controllers
/filters
/services
...
Modules
/core (sub-project - DAOs,services are placed here)
/batch (sub-project depends on core)
Я использую Guice DI почти везде включают в себя объект доступа к базе данных (DAO). И интерфейсы в ядре связаны в Module
, размещенном в core
, который в конечном итоге получает унаследованный Module
в корневом проекте.
Основной модуль (/rootPlayProject/core/CoreModule.scala)
class CoreModule extends AbstractModule {
override def configure() = {
bind(classOf[FooDAO]).to(classOf[FooDAOImpl])
....
}
}
Корневой модуль (/rootPlayProject/Modules.scala)
class Module extends CoreModule {
override def configure() = {
super.configure()
bind(classOf[FooService]).to(classOf[FooServiceImpl])
}
}
Это работает очень хорошо, как приложение Playframework, хотя, я хотел бы использовать основной модуль для пакетных программ, и я хотел бы запускать партии без playframework.
до сих пор я пытался что-то вроде этого
object BatchA {
def main(args: Array[String]) = {
val injector = Guice.createInjector(new CoreModule)
val foo = injector.getInstance(classOf[FooDAO])
//do something with foo.
}
}
но так как требующие вещи моего DAO в Playframework создавать такие как ExecutionContext
, play.api.db.slick.DatabaseConfigProvider
и @play.db.NamedDatabase
, выше код не работает.
Мой вопрос: как я могу позволить этим вещам связать себя без создания игрового приложения?
Заранее спасибо.
случай «Option1» означает, что приложение для воспроизведения работает, а я делаю то, что хочу, правильно? Если это не слишком сложно сделать, я предпочитаю последний, поэтому мне не нужно запускать игровое приложение для выполнения просто пакета. – suish
В вашем случае вариант 2 может быть более разумным. – doctorless