2016-05-22 8 views
0

Ich spiele gerade mit Play Framework herum und als Datenbank möchte ich Couchbase 4.5 verwenden (das gerade in der Beta ist, sollte aber kein Problem sein).Play Framework 2.5 mit Couchbase 4.5

Hier ist meine Frage: In der Dokumentation Couchbase Sie schlagen vor, nur eine Instanz von CoucbaseCluster und nur eine Instanz von Bucket verwenden. Aber wie errichte ich diese Instanzen beim Start und verwende sie global in allen meinen Controllern. Ich bin schon so weit zu wissen, dass ich Dependency Injection verwenden muss, aber ich habe keine Ahnung, wie das zu realisieren ist.

Warte jetzt, indem ich das schreibe Ich merke, dass irgendeine Art von globalem Objekt mit diesen Instanzen altmodisch ist. Ich muss diese Instanzen in alle meine Controller injizieren, die sie verwenden sollten, richtig?

Jede Hilfe wäre willkommen!

+1

Ja, Sie sind mit DI auf dem richtigen Weg. Du würdest ein Modul erstellen, es als Singleton binden und es so eifrig tun, nehme ich an. Play hat Guice-Unterstützung eingebaut, und es ist ziemlich einfach, dies zu tun. Überprüfen Sie die Dokumentation für einige Hinweise: https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection Für ein Beispiel schauen Sie sich ReactiveMongo, die dieses Muster verwendet. –

+0

@MichaelKendra Hey danke für die Richtung. Ich las diese Seite wieder konzentrierter und zusammen mit den Beispielen im Spiel habe ich es laufen lassen! –

Antwort

0

Also, nach einiger Bastelei habe ich es funktioniert:

ich mit meinem Eimer

@Singleton 
class CouchbaseConnectionPool @Inject() (appLifecycle: ApplicationLifecycle){ 
    val cluster=CouchbaseCluster.create("127.0.0.1") 
    val dataBucket=cluster.openBucket("data") 
    val fileBucket=cluster.openBucket("files") 
    appLifecycle.addStopHook {() => 
    cluster.disconnect() 
    Future.successful(()) 
    } 
} 

und der Controller sieht aus wie diese

class DirectDBAccess @Inject() (pool:CouchbaseConnectionPool) extends Controller { 
    def listAll(dbtype:String) = Action { 
    val result:N1qlQueryResult = pool.dataBucket.query(N1qlQuery.simple("select bucket.* from bucket where type=\""+dbtype+"\"")) 
    val data=result.allRows().mkString(",") 
    val total=result.allRows().length 
    val response="{data:["+data+"],total:"+total+"}" 

    Ok(response).as("application/json") 
    } 
} 

und schließlich eine Singleton-Klasse erstellt binden Alles zusammen fügte ich hinzu

bind(classOf[CouchbaseConnectionPool]).asEagerSingleton() 

zu module.scala und es funktioniert!