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?
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") '. –