Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/scala/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Scala 如何使用MacWire(play framework)向服务注入依赖项_Scala_Playframework_Playframework 2.0_Macwire - Fatal编程技术网

Scala 如何使用MacWire(play framework)向服务注入依赖项

Scala 如何使用MacWire(play framework)向服务注入依赖项,scala,playframework,playframework-2.0,macwire,Scala,Playframework,Playframework 2.0,Macwire,我有一个服务类,该服务有一个方法getSomethingFromApi,现在,我想有一个play配置实例,这样我可以从application.conf中提取内容,还有一个play WSClient,这样我可以执行http调用 这就是我希望我的服务的外观: class MyApiService { def getSomethingFromApi(whichApi: String): Future[ApiRes] = { wsClient.url(configuration.getSt

我有一个服务类,该服务有一个方法
getSomethingFromApi
,现在,我想有一个play配置实例,这样我可以从application.conf中提取内容,还有一个play WSClient,这样我可以执行http调用

这就是我希望我的服务的外观:

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:

import com.softwaremill.macwire._

trait ServicesModule {

  lazy val myService: MyApiService = wire[MyApiService]

}
我现在的问题是,使用连线播放配置和WSClient实例的正确方法是什么。。?因为目前我的服务中需要这些实例,但我没有这些实例,我应该如何以正确的方式进行?
谢谢

有了macwire,可能会是这样的

// MyApiService.scala
class MyApiService(wsClient: WSClient) { ... }

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

我自己还没有尝试过在play中使用macwire,所以我对第一次使用macwire的信心相对较低,但macwire play示例建议提供WSClient所需的值。很可能不是所有的组件都需要,但有些可能需要,所以我建议从
开始,然后逐渐添加更多组件,直到它工作为止。

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

import pureconfig._
import pureconfig.error.ConfigReaderFailures

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

val config: Either[pureconfig.error.ConfigReaderFailures,YourConfClass] = loadConfig[YourConfClass]
然后可以使用macwire将其传递到应用程序的任何组件

从播放2.6.X开始,应使用
ws
依赖项提供的
ahcwsc组件
,如下所示:

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

libraryDependencies += ws
在您的模块中,在
ahcwsc组件中混合trait并连接
WSClient

trait ServicesModule with AhcWSComponents {
    lazy val wsClient = wire[WSClient]
    lazy val apiService = wire[MyApiService]
}
MyApiServic
e中,将
WSClient
添加为参数。给建造师

class MyApiService(wsClient: WSClient) { ... }

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

类MyApiService@Inject()(ws:WSClient)
@erip但是服务模块如何传递此注入的依赖项呢?是macwire@Inject()吗?原因如果不是,将在运行时进行评估否?我想让它保持纯macwire手动编辑的状态,以获得答案:)如果我这样做,我如何从MyApiService访问wsClient和apiService。。?我想扩展ServicesModule?@jackmiao
apiService
MyApiService
的一个实例,所以您不能在那里访问它。从
MyApiService
访问
wsClient
非常简单-它是构造函数参数之一,因此您只需在那里执行
wsClient.url(…)