Ошибка при попытке внедрить зависимость в Lagom

Я пытаюсь создать простую службу для отправки электронных писем с использованием платформы Lagom и Scaladsl. Я пытаюсь использовать плагин Play Mailer для обработки электронных писем, но я изо всех сил пытаюсь внедрить его в реализацию службы.

Я создал сервисный трейт и реализацию, передав mailerClient в качестве зависимости в конструкторе.

trait MailerService extends Service { ... }

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

Я подключаю службу в ApplicationLoader, следуя шаблону, описанному в документации Lagom и в приложении hello world с помощью macwire.

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])
}

Когда я пытаюсь скомпилировать, я получаю следующую ошибку.

[ошибка] /.../workspace/mailer/mailer-impl/src/main/scala/com/example/mailer/impl/MailerApplicationLoader.scala:92: не удается найти значение типа: [play.api.libs. mailer.MailerClient]

Я думал, что macwire сможет разобраться в зависимостях от конструктора, но похоже, что это не совсем так. Я пробовал разные варианты, например, безуспешно пытался подключить его явно в загрузчике приложений.

Я почти уверен, что есть что-то неправильное в том, как работает DI в Lagom, но я не могу понять это.

Любые идеи?


person Micho    schedule 12.09.2017    source источник


Ответы (1)


Чтобы 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])
}

Это описано в документации Play Mailer по внедрению во время компиляции.

person Tim Moore    schedule 12.09.2017