Инъекция конструктора Dagger 2 в kotlin с именованными аргументами

у меня есть такая зависимость:

@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-это интерфейс, и он нужен мне для насмешливых целей в моих тестах.

что я могу сделать?

1 ответов


вы хотите аннотировать параметры конструктора, если вы делаете инъекцию конструктора, а не поля-используйте @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)

Edit: на самом деле, так как порядок разрешения для целей аннотаций

  • парам;
  • свойства;