0

我在 appModule 中有一个无范围的绑定,并且与使用 Singleton 范围注入的构造函数相同的类。当我在 appComponent 中为 Foo 添加声明时,生成的代码在没有任何即非作用域绑定的情况下拾取模块绑定,而DoubleCheck不是构造函数注入的 Singleton 绑定,为什么会这样?

@Module
public class AppModule {

     @Provides
     public Foo provideFoo() {
         return new Foo();
     }
}

@Component(module = AppModule.class)
@Singleton
public interface AppComponent {
     Foo getFoo();
}

@Singleton
class Foo @Inject constructor(){
     //..
}
4

1 回答 1

0

在如何提供依赖项方面存在一些层次结构,我还没有找到这方面的文档,但我也遇到了同样的事情。如果我从测试中正确回忆它,Dagger 尝试从中获取依赖项的层次结构如下:

  1. 绑定实例(通过组件构建器方法;即@BindsInstance)
  2. 模块提供
  3. 构造函数注入的类

在这个列表中的某个地方,可能还应该包含已配置的依赖项(从您的组件所依赖的父组件提供),但我不知道它在层次结构中的位置。

通常不需要以多种方式提供相同的依赖项,为什么你们都想通过模块和构造函数注入来提供依赖项?如果有多个依赖项,但它们存在于不同的范围内,请尝试使用不同的范围而不是单例。

我可以想到你想使用这个机制的一个原因,那就是当你通常希望通过构造函数或模块注入提供某个依赖项时,但特别是对于测试构建,你想用不同的依赖项覆盖该依赖项通过更改组件在测试构建中的组成方式(即,然后更改 DaggerComponent 使其需要 @BindsInstance 方法以使用测试依赖项覆盖默认依赖项)。

于 2021-10-19T10:41:52.260 回答