【问题标题】:Play Framework 2.5 with Couchbase 4.5使用 Couchbase 4.5 玩 Framework 2.5
【发布时间】:2016-05-25 03:02:50
【问题描述】:

我目前正在使用 Play Framework,作为数据库,我想使用 Couchbase 4.5(目前处于测试阶段,但应该不成问题)。

这是我的问题: 在 Couchbase 文档中,他们建议只使用一个 CoucbaseCluster 实例和一个 Bucket 实例。 但是我如何在启动时建立这些实例并在我的所有控制器中全局使用它们。 到目前为止,我已经知道我必须使用依赖注入,但我不知道如何实现这一点。

现在写这篇文章,我意识到带有这些实例的某种全局对象已经过时了。我必须将这些实例注入到所有应该使用它们的控制器中,对吧?

任何帮助将不胜感激!

【问题讨论】:

  • 是的,你在 DI 上走在了正确的轨道上。您将创建一个模块,将其绑定为一个单例,并且我假设您会急切地这样做。 Play 内置了 Guice 支持,使用它很容易做到这一点。检查文档以获取一些指示:playframework.com/documentation/2.5.x/ScalaDependencyInjection 例如,查看使用此模式的 ReactiveMongo。
  • @MichaelKendra 嘿,感谢您的指导。我更加专注地再次阅读了该页面,并结合游戏中的示例运行它!

标签: scala playframework dependency-injection couchbase


【解决方案1】:

所以,经过一番修改后,我让它工作了:

我用我的存储桶创建了一个 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 并且它可以工作!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-06-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多