匕首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注释在我的构造函数签名中不起作用。 我不太清楚如何才能使其工作。

注意:这个编译很好,如果我把Named注解丢掉,并把构造函数参数的types改成它们的具体forms。 然而,Spice是一个接口,我需要它在我的测试中进行嘲笑。

我能做什么?

你要注释的构造函数参数,如果你正在做构造函数注入,而不是字段 – 使用@ @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;
  • 属性;
  • 领域。

根据文档 ,没有注释的目标也应该注释构造函数的参数。 所以你可以完全放弃目标:

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