web-dev-qa-db-ja.com

名前付き引数を使用したkotlinのDagger 2コンストラクター注入

私はこの依存関係があります:

@Singleton
class SpiceMix @Inject constructor(@field:[Named("oregano")] private val oregano: Spice,
                                   @field:[Named("sage")] private val sage: Spice,
                                   @field:[Named("rosemary")] private val rosemary: Spice) 

そして、その依存関係を満たすモジュール:

@Module
class SpiceModule {

    @Provides
    @Named("oregano")
    @Singleton
    fun provideOregano(): Spice = Oregano()

    @Provides
    @Named("sage")
    @Singleton
    fun provideSage(): Spice = Sage()

    @Provides
    @Named("rosemary")
    @Singleton
    fun provideRosemary(): Spice = Rosemary()

SpiceMixは、アプリのさまざまな場所に挿入されます。

ただし、これはコンパイルされず、エラーが発生します。

Spice cannot be provided without an @Provides-annotated method

@Namedアノテーションは、私のコンストラクタシグネチャではまったく機能しないと思います。私はそれをどのように機能させることができるのかよくわかりません。

注:名前付き注釈を捨て、コンストラクターパラメーターの型を具体的な形式に変更すると、これは正常にコンパイルされます。ただし、Spiceはインターフェイスであり、テストではモックの目的で必要です。

私に何ができる?

24
Vas

フィールドではなくコンストラクター注入を行う場合は、コンストラクターパラメーターに注釈を付けます-@param:注釈ターゲットを使用します。

@Singleton
class SpiceMix @Inject constructor(@param:Named("oregano") private val oregano: Spice,
                                   @param:Named("sage") private val sage: Spice,
                                   @param:Named("rosemary") private val rosemary: Spice)

編集:実際には、注釈ターゲットの解決順序は

  • param;
  • プロパティ;
  • フィールド。

docs に従って、注釈ターゲットがない場合は、コンストラクターのパラメーターに注釈を付ける必要があります。したがって、ターゲットを完全にドロップできます。

@Singleton
class SpiceMix @Inject constructor(@Named("oregano") private val oregano: Spice,
                                   @Named("sage") private val sage: Spice,
                                   @Named("rosemary") private val rosemary: Spice)
26
zsmb13