热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

具有命名参数的kotlin中的Dagger2构造函数注入

如何解决《具有命名参数的kotlin中的Dagger2构造函数注入》经验,为你挑选了1个好方法。

我有这种依赖:

@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注释并将构造函数参数的类型更改为其具体形式,则此编译很好.但是,Spice是一个接口,我需要它在我的测试中用于模拟目的.

我能做什么?



1> zsmb13..:

如果您正在进行构造函数注入,而不是字段,则需要注释构造函数参数 - 使用@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)


推荐阅读
author-avatar
歪果仁
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有