是否有可能首先实例化依赖关系,然后将其绑定到模块config
方法中?Scala Guice - 用mixin注入
目前,我有以下配置:
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
的情况下,我需要吉斯注入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]
行。
任何想法如何创建一个实例并混合在一个trait中,同时仍然将下游参数依赖关系的解析委托给Guice?
Guice不允许定义2种方法来创建相同的接口。我不是Scala开发人员,所以我不会将其写为答案,但您需要的是[Binding Annotations](https://github.com/google/guice/wiki/BindingAnnotations)。使用'@Named(“secure”)''将AddressService与SecureAddressView配合使用,并让配置方法中的绑定可用于任何不指定'@ Named'的地方。如果您不喜欢'@Named(“secure”)',您也可以创建自己的'@ SecureAddress'注释来代替它。 –