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