在Kotlin中,您可以像这样注入一个现场成员:
@Inject lateinit var coffee: Coffee
但是我在玩过Dagger之后注意到,虽然这有效,但是除非使用模块和组件,然后使用组件生成器来创建Coffee依赖项,否则coffee始终为null。真的吗?仅仅拥有一个模块而不拥有一个组件就不可能了吗?
答案 0 :(得分:1)
@Inject
批注和模块用于使Dagger知道如何创建依赖项。然后Dagger需要一些可以实际创建具有这些依赖关系的东西。这是组件进入的地方,这就是为什么要声明返回要在其中注入内容的类型的接口方法的原因。
Dagger将使用组件的方法来生成依赖项注入的实现。人们通常说组件是依赖关系之间的“胶水”,因为组件通过其方法设置了对象图的根。
因此,回答您的问题:是的,您至少需要一个组件。
答案 1 :(得分:1)
基于没有组件的模块进行注入有点像询问您是否可以吃晚餐(如果您有食谱但没有厨房)。模块只是配方(配置);组件完成所有烹饪(创建)。在这种比喻中,实现本身就是要素,Dagger会根据需要为您准备这些要素。
Dagger的大多数功能来自实现 Dagger基于您用@Component
注释的界面进行的开发。 Dagger的其余代码生成器处理您的@Module
类和使用@Inject
的类,以便Dagger可以调用方法和构造函数并设置字段,但是如果没有@Component
,则没有东西会调用那些帮助器类。因此,在所有情况下,@Component
都是必不可少的。
也就是说,只要您有一个组件,you do have a choice是让Dagger创建您的类(从Dagger中检索实例)还是手动创建您的类并让Dagger填充其@Inject
成员以后。