2016-05-22 69 views
0

我目前正在玩Play Framework和作爲數據庫我想使用Couchbase 4.5(現在在測試版中,但不應該是一個問題)。Couchbase 4.5播放框架2.5

我的問題是: 在Couchbase文檔他們建議使用CoucbaseCluster只有一個實例和只是一個實例。 但是我如何在啓動時建立這些實例並在我的所有控制器中全局使用它們。 我已經知道,我必須使用依賴注入,但我不知道如何實現這一點。

現在就寫這個,我意識到某些具有這些實例的全局對象是老派。我必須將這些實例注入到所有應該使用它們的控制器中,對吧?

任何幫助,將不勝感激!

+1

是的,你在DI的正確軌道上。你會創建一個模塊,將它作爲一個單例綁定,並且這樣做是非常熱切的。 Play具有內置的Guice支持,使用它可以非常容易地完成此操作。檢查文檔中的一些指針:https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjection例如,查看使用此模式的ReactiveMongo。 –

+0

@MichaelKendra嘿,謝謝你的指導。我再次更加專注地閱讀那篇文章,並且結合遊戲中的例子,我將它運行起來! –

回答

0

所以,一些修修補補後,我得到它的工作:

我創建了一個Singleton類和我的水桶

@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(()) 
    } 
} 

和控制器看起來像這樣

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") 
    } 
} 

並最終綁定我加在一起

bind(classOf[CouchbaseConnectionPool]).asEagerSingleton() 

到module.scala,它的工作原理!