首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用MacWire (play框架)为服务注入依赖项

如何使用MacWire (play框架)为服务注入依赖项
EN

Stack Overflow用户
提问于 2017-07-03 05:25:42
回答 2查看 700关注 0票数 2

我有一个服务类,服务有一个方法getSomethingFromApi,现在,我想要有一个播放配置实例,这样我就可以从application.conf中提取东西,还有一个播放WSClient,这样我就可以执行http调用。

这是我希望我的服务看起来是这样的:

代码语言:javascript
复制
class MyApiService {

  def getSomethingFromApi(whichApi: String): Future[ApiRes] = {
    wsClient.url(configuration.getString(whichApi)).withHttpHeaders(("Content-Type", "application/json")).get.map { res =>
      response.status match {
        case Status.OK => // do something
        case _ => throw new Exception
      }
    }
  }

}

这是连接我的服务的ServicesModule:

代码语言:javascript
复制
import com.softwaremill.macwire._

trait ServicesModule {

  lazy val myService: MyApiService = wire[MyApiService]

}

我现在的问题是,使用连接播放配置和WSClient实例的正确方式是什么?因为目前我需要在我的服务中使用这些实例,但是我没有它们,我应该如何正确地这样做呢?谢谢

EN

回答 2

Stack Overflow用户

发布于 2017-07-04 21:46:05

使用macwire,它可能看起来像这样

代码语言:javascript
复制
// MyApiService.scala
class MyApiService(wsClient: WSClient) { ... }

// ServicesModule.scala
trait ServicesModule with NingWSComponents {
    lazy val wsClient = wire[WSClient]
    lazy val apiService = wire[MyApiService]
}

我自己还没有尝试过使用macwire和play,所以我对第一次尝试就能正常工作的信心相对较低,但macwire play示例建议mixing in certain Play modules为WSClient提供所需的值。很可能不是所有的都需要,但有些可能是需要的-所以我建议先从NingWSComponents开始,然后逐步添加更多,直到它起作用。

票数 0
EN

Stack Overflow用户

发布于 2017-09-04 23:00:32

对于配置,我建议使用类似于PureConfig的内容,并按如下方式加载配置

代码语言:javascript
复制
import pureconfig._
import pureconfig.error.ConfigReaderFailures

case class YourConfClass(name: String, quantity: Int)

val config: Either[pureconfig.error.ConfigReaderFailures,YourConfClass] = loadConfig[YourConfClass]

然后可以使用macwire将其传递给应用程序的任何组件。

从Play 2.6.X开始,用户应该使用由ws依赖项提供的AhcWSComponents,如下所示:

在build.sbt文件中,将ws依赖项添加到项目中

代码语言:javascript
复制
libraryDependencies += ws

在您的模块特征中,混合使用AhcWSComponents特征并连接WSClient

代码语言:javascript
复制
trait ServicesModule with AhcWSComponents {
    lazy val wsClient = wire[WSClient]
    lazy val apiService = wire[MyApiService]
}

在您的MyApiService中,添加WSClient作为参数。添加到构造函数

代码语言:javascript
复制
class MyApiService(wsClient: WSClient) { ... }

现在你就完事了。此一般规则适用于所有提供的依赖项。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/44875361

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档