是否可以先实例化依赖项,然后将其绑定到模块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 构造函数显式提供所有参数。必须有一种更优雅的混合性状的方式。或者也许不是...