尝试在Lagom中注入依赖项时出错

我正在尝试使用Lagom框架和Scaladsl创建一个简单的服务来发送电子邮件 . 我正在尝试使用Play Mailer插件处理电子邮件,但我正在努力将其注入服务实现 .

我创建了服务特征和实现,将 mailerClient 作为构造函数中的依赖项传递 .

trait MailerService extends Service { ... }

class MailerServiceImpl(mailerClient: MailerClient, persistentEntityRegistry: PersistentEntityRegistry) extends MailerService {
...
}

我在ApplicationLoader中连接服务,遵循Lagom documentation和使用macwire的hello world应用程序中解释的模式 .

abstract class MailerApplication(context: LagomApplicationContext) 
  extends LagomApplication(context)
    with CassandraPersistenceComponents
    with AhcWSComponents {

  override lazy val lagomServer: LagomServer = serverFor[MailerService](wire[MailerServiceImpl])
  override lazy val jsonSerializerRegistry = MailerSerializerRegistry
  persistentEntityRegistry.register(wire[MailEntity])
}

当我尝试编译时,我收到以下错误 .

[error] /.../workspace/mailer/mailer-impl/src/main/scala/com/example/mailer/impl/MailerApplicationLoader.scala:92:找不到类型的值:[play.api.libs .mailer.MailerClient]

我以为macwire能够从构造函数中找出依赖关系,但它看起来并不是真的 . 我尝试了不同的选项,比如尝试在应用程序加载器中显式连接它,但到目前为止没有任何成功 .

我很确定我在Lagom中DI的工作方式有问题,但我无法理解 .

有任何想法吗?

回答(1)

2 years ago

要使 MailerClient 可注射,您需要将 MailerComponents 特征与您在服务中使用的其他特征混合在一起 .

例如:

// ...
import play.api.libs.mailer._

abstract class MailerApplication(context: LagomApplicationContext) 
  extends LagomApplication(context)
    with MailerComponents // add this here
    with CassandraPersistenceComponents
    with AhcWSComponents {

  override lazy val lagomServer: LagomServer = serverFor[MailerService](wire[MailerServiceImpl])
  override lazy val jsonSerializerRegistry = MailerSerializerRegistry
  persistentEntityRegistry.register(wire[MailEntity])
}

这在compile-time injection上的Play Mailer文档中有所描述