2017-06-12 1 views
0

Est-il possible d'instancier d'abord la dépendance puis de la lier dans la méthode du module config?Scala Guice - injecter avec un mix

Actuellement, j'ai la configuration suivante:

class PersonServiceImpl @Inject()(addressService: AddressService) { 
    ... 
} 

class AppModule extends AbstractModule with ScalaModule { 

    def configure() { 
    bind[PersonService].to[PersonServiceImpl] 
    bind[AddressBook].to[AddressBookImpl] 
    } 

    @Provides @Singleton 
    def provideAddressService(addressBook: AddressBook): AddressService = { 
    new AddressServiceImpl(addressBook) with SecureAddressView 
    } 

} 

... qui fonctionne très bien. Ce que je veux faire maintenant est de déplacer l'instanciation du AddressServiceImpl dans un module séparé. Donc, le problème est que pour créer une instance de AddressServiceImpl j'ai besoin Guice pour injecter le paramètre addressBook pour moi, mais je veux aussi créer l'instance moi-même donc je peux mélanger SecureAddressView dans:

class AddressModule extends AbstractModule with ScalaModule { 

    def configure() { 
    bind[AddressService].to[AddressServiceImpl] 
    } 

    @Provides @Singleton 
    def provideAddressService(addressBook: AddressBook): AddressService = { 
    new AddressServiceImpl(addressBook) with SecureAddressView 
    } 

} 

Cela échoue Cependant, Guice revient se plaindre de la méthode provideAddressService. Il dit essentiellement que A binding to AddressService was already configured et pointe sur la ligne bind[AddressService].to[AddressServiceImpl] dans la méthode configure.

Une idée de comment créer une instance et mélanger un trait tout en déléguant la résolution des dépendances de paramètres en aval à Guice?

+1

Guice ne permettra pas de définir 2 méthodes pour créer la même interface. Je ne suis pas un développeur Scala, donc je n'écrirai pas cela comme une réponse, mais vous avez besoin de [Binding Annotations] (https://github.com/google/guice/wiki/BindingAnnotations). Utilisez '@Named (" secure ")' pour votre AddressService avec SecureAddressView et laissez la liaison dans la méthode configure être utilisée partout où vous n'indiquez pas '@ Named'. Vous pouvez également créer votre propre annotation '@ SecureAddress' à utiliser à la place si vous n'aimez pas' @Named ("secure") '. –

Répondre

0

OK, tout à fait évident, mais j'ai été induit en erreur par le fait que je devais remplacer la méthode configure. Donc, tout ce que je devais faire est de fournir une implémentation fictive pour configure.

class AddressModule extends AbstractModule with ScalaModule { 

    override def configure(): Unit =() 

    @Provides @Singleton 
    def provideAddressService(addressBook: AddressBook): AddressService = { 
    new AddressServiceImpl(addressBook) with SecureAddressView 
    } 

} 

Bien que cela semble encore assez douteux que je dois fournir explicitement tous les paramètres au constructeur AddressService. Il doit y avoir une façon plus élégante de mélanger les traits. Ou peut-être pas ...