我看过一些与 DI 相关的帖子,它们使用蛋糕模式。
其中之一是我的一位同事共享的http://jonasboner.com/real-world-scala-dependency-injection-di/ 。
但是,如果我需要使用 Play 2.5 中的 WSClient,我可以在不求助于 guice 的情况下掌握它吗?
我看过一些与 DI 相关的帖子,它们使用蛋糕模式。
其中之一是我的一位同事共享的http://jonasboner.com/real-world-scala-dependency-injection-di/ 。
但是,如果我需要使用 Play 2.5 中的 WSClient,我可以在不求助于 guice 的情况下掌握它吗?
是的,Scala 允许您仅基于语言结构来执行此操作,而无需使用 Guice 等外部 DI 框架。为了说明这一点,请考虑以下示例(此示例大量借鉴了问题中链接的 Jonas Bonér 博客文章):
package di.example
import play.api.libs.ws.WSClient
trait WSClientComponent {
val wsClient: WSClient
}
NotificationService是要注入WSClient的服务。
package di.example
trait NotificationServiceComponent {this: WSClientComponent =>
val notificationService: NotificationService
class NotificationService{
def getNotifications = wsClient.url("some-url")
}
}
接下来,ComponentRegistry是将我们的依赖关系连接在一起的“模块”对象。
package di.example
import play.api.libs.ws.{WS, WSClient}
object ComponentRegistry extends WSClientComponent with NotificationServiceComponent {
override val wsClient: WSClient = WS.client
override val notificationService: NotificationService = new NotificationService
}