Играть 2.5 Силуэт 4 - DI с хитростью

Язык: Скала; Framework: Play 2.5; Библиотеки: Силуэт 4.0, Guice, scala-guice.

Один из официальных начальных проектов Silhouette использует guice и scala-guice (net.codingwell.scalaguice.ScalaModule) для написания конфигурации DI. Код выглядит так:

import net.codingwell.scalaguice.ScalaModule

class Module extends AbstractModule with ScalaModule{

  /**
    * Configures the module.
    */
  def configure() {

    bind[Silhouette[MyEnv]].to[SilhouetteProvider[MyEnv]]
    bind[SecuredErrorHandler].to[ErrorHandler]
    bind[UnsecuredErrorHandler].to[ErrorHandler]
    bind[IdentityService[User]].to[UserService]

Интересно, как бы выглядел этот код без магии из библиотеки net.codingwell.scalaguice. Может ли кто-нибудь переписать эти привязки, используя только оригинальные слова?

кроме того, у меня есть также этот код:

@Provides
  def provideEnvironment(
      userService: UserService,
      authenticatorService: AuthenticatorService[CookieAuthenticator],
      eventBus: EventBus
  ): Environment[MyEnv] = {
    Environment[MyEnv](
      userService,
      authenticatorService,
      Seq(),
      eventBus
    )
  }

Заранее спасибо.

2 ответа

Решение

Спасибо insan-e за указание в правильном направлении. Вот ответ, показывающий, как внедрить универсальные реализации, используя guice:

Внедрить универсальную реализацию с помощью Guice

Таким образом, если удалить библиотеку scala-guice из уравнения, привязки можно записать так:

import com.google.inject.{AbstractModule, Provides, TypeLiteral}
class Module extends AbstractModule {

  /**
    * Configures the module.
    */
  def configure() {
    bind(new TypeLiteral[Silhouette[MyEnv]]{}).to(new TypeLiteral[SilhouetteProvider[MyEnv]]{})

Справа по признаку, представляющему функции, есть описание, смотрите здесь: https://github.com/codingwell/scala-guice/blob/develop/src/main/scala/net/codingwell/scalaguice/ScalaModule.scala

Таким образом, в этом случае это будет выглядеть примерно так:

class SilhouetteModule extends AbstractModule {

  def configure {
    bind(classOf[Silhouette[DefaultEnv]]).to(classOf[SilhouetteProvider[DefaultEnv]])
    bind(classOf[CacheLayer]).to(classOf[PlayCacheLayer])

    bind(classOf[IDGenerator]).toInstance(new SecureRandomIDGenerator())
    bind(classOf[PasswordHasher]).toInstance(new BCryptPasswordHasher)
    ...
}
Другие вопросы по тегам