2017-06-12 3 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のインスタンス化を別のモジュールに移すことです。これが失敗した

class AddressModule extends AbstractModule with ScalaModule { 

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

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

} 

:だから、問題は、私は私のためaddressBookパラメータを注入するGuiceのが必要ですが、私はまた、インスタンスを作成したいAddressServiceImplのインスタンスを作成するために、自分自身がそう私はSecureAddressViewを混在させることができるということですしかし、GuiceがprovideAddressServiceメソッドについて不満を返すにつれて、基本的にはA binding to AddressService was already configuredと書いてあり、bind[AddressService].to[AddressServiceImpl]行を指しているのはconfigureの方法です。

Guiceにダウンストリームパラメータの依存関係の解決を依頼しながら、特性のインスタンスとミックスを作成する方法はありますか?

+1

Guiceは、同じインタフェースを作成するための2つのメソッドの定義を許可しません。私はScalaの開発者ではないので、これを答えとして書くつもりはありませんが、必要なのは[バインディングアノテーション](https://github.com/google/guice/wiki/BindingAnnotations)です。 SecureAddressViewを使用してAddressServiceに '@Named(" secure ")を使用し、' @ Named'を指定しない場合はconfigureメソッドのバインディングを使用させます。 '@Named(" secure ")'が気に入らなければ、あなた自身の '@ SecureAddress'アノテーションを作成して代わりに使うこともできます。 –

答えて

0

[OK]をクリックします。これはかなり明白ですが、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コンストラクタにすべてのパラメータを明示的に指定する必要があるため、これはかなり厄介です。ミックスインの特質のよりエレガントな方法がなければならない。または、そうでないかもしれません...

関連する問題