Ich arbeite an Playframework2.5 mit Play-Slick und damit verbundenen Programmen wie Batch.Erstellen Sie eine Instanz der Klasse, die DI über Playframe Guice unabhängig in Scala tut
aktuelle Projektstruktur ist wie
/rootPlayProject
/app
/controllers
/filters
/services
...
Modules
/core (sub-project - DAOs,services are placed here)
/batch (sub-project depends on core)
Ich verwende Guice DI fast überall Database Access Object (DAO) umfasst. Und Schnittstellen im Kern sind in Module
gebunden in core
platziert, die am Ende von Module
in Root-Projekt vererbt werden.
Core Module (/rootPlayProject/core/CoreModule.scala)
class CoreModule extends AbstractModule {
override def configure() = {
bind(classOf[FooDAO]).to(classOf[FooDAOImpl])
....
}
}
Root-Modul (/rootPlayProject/Modules.scala)
class Module extends CoreModule {
override def configure() = {
super.configure()
bind(classOf[FooService]).to(classOf[FooServiceImpl])
}
}
Dies obwohl ziemlich gut als Playframework Anwendung funktioniert, ich möchte Core-Modul für Batch-Programme verwenden und ich würde die Chargen ohne Playframework ausführen möchten.
bisher habe ich versucht, so etwas wie dieses
object BatchA {
def main(args: Array[String]) = {
val injector = Guice.createInjector(new CoreModule)
val foo = injector.getInstance(classOf[FooDAO])
//do something with foo.
}
}
aber da meine DAO erfordert Dinge schaffen Playframework wie ExecutionContext
, play.api.db.slick.DatabaseConfigProvider
und @play.db.NamedDatabase
, über Code nicht ausgeführt.
Meine Frage ist, wie kann ich diese Dinge binden lassen, ohne Anwendung Builder zu spielen?
Vielen Dank im Voraus.
den Fall von 'Option1' zu starten, es bedeutet, dass Anwendung läuft, während ich mache, was ich will, richtig? Wenn es nicht zu schwer ist, bevorzuge ich Letzteres, so dass ich keine Play-Anwendung ausführen muss, um nur einen Batch auszuführen. – suish
In Ihrem Fall könnte Option 2 sinnvoller sein. – doctorless