首页 > 解决方案 > 如何将一些注入和一些提供的类放入提供的类中

问题描述

我开始使用 Dagger 2 并试图弄清楚如何获得@Inject@Provides很好地协同工作。注入顶级类时,很容易让一切正常工作。像这样:

class TopLevelClass {

    @Inject
    SecondaryClass1 class1;

    private final SecondaryClass2 class2;

    @Inject
    TopLevelClass(SecondaryClass2 class2) {
        this.class2 = class2;
    }
}

@Module
class MyModule {

    @Provides
    SecondaryClass2 provideSecondaryClass2() {
        return new SecondaryClass2();
    }
}

但是,当我也必须@Provides为顶级类创建方法时,一切都会停止工作。像这样:

class TopLevelClass {

    @Inject
    SecondaryClass1 class1;

    private final SecondaryClass2 class2;

    TopLevelClass(SecondaryClass2 class2) {
        this.class2 = class2;
    }
}

@Module
class MyModule {

    @Provides
    TopLevelClass provideTopLevelClass(SecondaryClass2 class2) {
        return new TopLevelClass(class2);
    }

    @Provides
    SecondaryClass2 provideSecondaryClass2() {
        return new SecondaryClass2();
    }
}

在这个例子中,我发现 SecondaryClass1 永远不会被注入,所以当我尝试访问它时会得到一个 NPE。对于提供的顶级课程,我应该以不同的方式执行此操作吗?

PS我认为这无关紧要,但这是我正在使用的组件,以防万一:

@Component(modules = {MyModule.class})
interface MyComponent {

    TopLevelClass getTopLevelClass();

}

谢谢!

标签: javadagger-2

解决方案


您有 2 个选项:

  • 利用构造函数注入,让 Dagger 创建并注入对象(无需任何@Provides注解的方法) 对象无需任何代码即可使用。这就是匕首闪耀的地方。
  • 自己创建对象并确保在从带@Provides注释的方法返回之前正确设置它

我不知道您为什么更喜欢第二个选项,或者为什么在可以使用构造函数时甚至要使用字段注入,但是,正如您所发现的,如果您手动构造字段,则不会注入字段目的。生成的 Dagger 代码都不会运行——您必须自己执行此操作。

想到的一种方法是请求组件,然后注入对象。

@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2, MyComponent component) {
    TopLevelClass tlc = new TopLevelClass(class2);
    component.inject(tlc);
    return  tlc;
}

推荐阅读