2017-06-12 74 views
0

是否有可能首先实例化依赖关系,然后将其绑定到模块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?

+1

Guice不允许定义2种方法来创建相同的接口。我不是Scala开发人员,所以我不会将其写为答案,但您需要的是[Binding Annotations](https://github.com/google/guice/wiki/BindingAnnotations)。使用'@Named(“secure”)''将AddressService与SecureAddressView配合使用,并让配置方法中的绑定可用于任何不指定'@ Named'的地方。如果您不喜欢'@Named(“secure”)',您也可以创建自己的'@ SecureAddress'注释来代替它。 –

回答

0

好吧,很明显,但我被我不得不重写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构造函数。必须有一种更加优雅的mixin特性。或者可能不......