web-dev-qa-db-fra.com

Dague 2 constructeur constructeur dans kotlin avec arguments nommés

J'ai cette dépendance:

@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) 

Et un module pour remplir ses dépendances:

@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()

Le SpiceMix est ensuite injecté à divers endroits de mon application.

Cependant, cela ne compile pas et j'obtiens une erreur:

Spice cannot be provided without an @Provides-annotated method

Je pense que les annotations @Named ne fonctionnent pas tout à fait dans ma signature de constructeur. Je ne sais pas trop comment y arriver.

Remarque: cela compile bien si je supprime les annotations Named et modifie les types des paramètres du constructeur en leurs formes concrètes. Cependant, Spice est une interface et j'en ai besoin pour me moquer de mes tests.

Que puis-je faire?

24
Vas

Vous souhaitez annoter les paramètres du constructeur si vous effectuez une injection de constructeur, et non les champs - utilisez la commande @param: cible d'annotation:

@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)

Éditer: en réalité, puisque l’ordre de résolution des cibles d’annotation est

  • param;
  • propriété;
  • champ.

selon docs , ne pas avoir d'annotation de cible devrait également annoter le paramètre du constructeur. Donc, vous pouvez simplement laisser tomber la cible:

@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