2016-05-22 6 views
0

私は現在、Play Frameworkとデータベースとして、私はCouchbase 4.5(現在はベータ版ですが、問題ではありません)を使用したいと考えています。 Couchbaseのドキュメントで、彼らはCoucbaseClusterの唯一のインスタンスとバケツの1つのインスタンスのみを使用することをお勧め:Play Framework 2.5 with Couchbase 4.5

は、ここに私の質問です。 しかし、これらのインスタンスを起動時に確立し、すべてのコントローラでグローバルに使用するにはどうすればよいですか。 依存性注入を使用しなければならないことをすでに知っていますが、これを実現する方法がわかりません。

これを書いてお待ちください。私は、これらのインスタンスを持つ何らかの種類のグローバルオブジェクトが古い学校であることを認識しています。これらのインスタンスを使用するすべてのコントローラにインスタンスを注入する必要があります。

助けていただけたら幸いです!

+1

はい、あなたはDIで正しい軌道に乗っています。あなたはモジュールを作成し、それをシングルトンとしてバインドし、熱心に私が推測します。 PlayにはGuiceのサポートが組み込まれており、これを使用して簡単に実行できます。いくつかのポインタについては、ドキュメントをチェックしてください:https://www.playframework.com/documentation/2.5.x/ScalaDependencyInjectionこのパターンを使用するReactiveMongoの例を見てください。 –

+0

@MichaelKendraちょっと感謝しています。そのページをもう少し集中して読んでみて、演奏の例とともに私はそれを走らせました! –

答えて

0

だから、私はそれが働いてしまったいくつかの工夫の後:

私は私のバケット

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

to module.scalaそれは動作します!