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?@jackmiaoapiService
是MyApiService
的一个实例,所以您不能在那里访问它。从MyApiService
访问wsClient
非常简单-它是构造函数参数之一,因此您只需在那里执行wsClient.url(…)
。