2016-11-07 2 views
3

Langue: Scala; Cadre: Lecture 2,5; Bibliothèques: Silhouette 4.0, Guice, scala-guice.Lecture 2.5 Silhouette 4 - DI avec guice

L'un des projets de graine de Silhouette officiels utilise guice et scala-guice (net.codingwell.scalaguice.ScalaModule) pour écrire la configuration DI. Code ressemble à ceci:

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] 

Je me demande, comment ce code ressemblerait sans la magie de la bibliothèque net.codingwell.scalaguice. Est-ce que quelqu'un pourrait réécrire ces liaisons en utilisant seulement le guice original?

en plus j'ai aussi ce code:

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

Merci à l'avance.

Répondre

2

Merci à insan-e pour pointant dans une bonne direction. Voici la réponse montrant comment injecter des versions génériques utilisant Guice:

Inject Generic Implementation using Guice

Ainsi, si la suppression bibliothèque scala-Guice de l'équation, les liaisons peuvent être écrites comme ceci:

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

Il y a un droit de description sur le trait présentant les fonctions, un coup d'oeil ici: https://github.com/codingwell/scala-guice/blob/develop/src/main/scala/net/codingwell/scalaguice/ScalaModule.scala#L32

Ainsi, dans ce cas, il se traduirait par quelque chose comme ceci:

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) 
    ... 
} 
+0

Merci pour la réponse, mais J'ai déjà essayé, et pour une raison quelconque, cela ne fonctionne pas. Je peux comprendre pourquoi. Si j'écris ceci: bind (classOf [Silhouette [DefaultEnv]]) .to (classOf [SilhouetteProvider [DefaultEnv]]) au lieu de ceci: bind [Silhouette [MyEnv]] .à [SilhouetteProvider [MyEnv]], je reçois erreur de compilation: –

+1

CreationException: Impossible de créer l'injecteur, voir les erreurs suivantes: 1) com.mohiva.play.silhouette.api.Environment ne peut pas être utilisé comme clé; Ce n'est pas entièrement spécifié. à com.mohiva.play.silhouette.api.SilhouetteProvider. (Silhouette.scala: 103) at identity.Module.configure (Module.scala: 47) (via les modules: com.google.inject.util.Modules $ OverrideModule -> identity.Module) –

+1

Impossible de lier les types génériques comme ça. Il ressemble plus à ceci: bind (nouveau TypeLiteral [Silhouette [DefaultEnv]] {}). To (classOf [SilhouetteProvider [DefaultEnv]]]) –