是否可以将基于蛋糕模式的DI用于Play框架提供的组件?

时间:2016-07-12 13:41:40

标签: scala playframework dependency-injection cake-pattern

我看过几个与DI相关的文章使用蛋糕模式。

其中一位同事http://jonasboner.com/real-world-scala-dependency-injection-di/分享了{{3}}。

但是,如果我需要使用Play 2.5中的说WSClient,我可以在不诉诸guice的情况下掌握这一点吗?

1 个答案:

答案 0 :(得分:0)

是的,Scala允许您仅基于语言结构执行此操作,而无需使用Guice等外部DI框架。为了说明这一点,请考虑以下示例(此示例大量借用了问题中链接的JonasBoné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

}