匕首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)