斯卡拉吉斯 - 注射混合剂



是否可以先实例化依赖项,然后将其绑定到模块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
  }
}

。这工作正常。我现在要做的是将AddressServiceImpl的实例化移动到一个单独的模块中。所以,问题是为了创建一个AddressServiceImpl实例,我需要Guice为我注入addressBook参数,但我也想自己创建实例,以便我可以混合SecureAddressView:

class AddressModule extends AbstractModule with ScalaModule { 
  def configure() {
    bind[AddressService].to[AddressServiceImpl]
  }
  @Provides @Singleton
  def provideAddressService(addressBook: AddressBook): AddressService = {
    new AddressServiceImpl(addressBook) with SecureAddressView
  }
}

然而,这失败了,因为Guice回来抱怨provideAddressService方法。它基本上说A binding to AddressService was already configured并指向configure方法中的bind[AddressService].to[AddressServiceImpl]行。

知道如何创建一个实例并混合一个特征,同时仍然将下游参数依赖关系的解析委托给 Guice?

好吧,很明显,但我被我必须覆盖configure方法的事实误导了。因此,我所要做的就是为configure提供一个虚拟实现。

class AddressModule extends AbstractModule with ScalaModule { 
  override def configure(): Unit = ()
  @Provides @Singleton
  def provideAddressService(addressBook: AddressBook): AddressService = {
    new AddressServiceImpl(addressBook) with SecureAddressView
  }
}

尽管这看起来仍然很狡猾,因为我必须向 AddressService 构造函数显式提供所有参数。必须有一种更优雅的混合性状的方式。或者也许不是...

最新更新