简体   繁体   中英

Scala Guice - inject with a mixin

Is it possible to instantiate the dependency first and then bind it in the module config method?

Currently I have the following config:

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
  }

}

... which works fine. What I want to do now is to move the instantiation of the AddressServiceImpl into a separate module. So, the problem is that in order to create an instance of AddressServiceImpl I need Guice to inject the addressBook parameter for me, but I also want to create the instance myself so I can mix SecureAddressView in:

class AddressModule extends AbstractModule with ScalaModule { 

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

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

}

This fails, though, as Guice comes back complaining about the provideAddressService method. It basically says that A binding to AddressService was already configured and points to the bind[AddressService].to[AddressServiceImpl] line in the configure method.

Any idea how to create an instance and mix in a trait while still delegating the resolution of downstream parameter dependencies to Guice?

OK, quite an obvious one but I was misled by the fact that I had to override the configure method. So, all I had to do is provide a dummy implementation for configure .

class AddressModule extends AbstractModule with ScalaModule { 

  override def configure(): Unit = ()

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

}

Although this still looks quite dodgy as I have to provide explicitly all the parameters to the AddressService constructor. There must be a more elegant way of mixin traits. Or maybe not...

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM