如何有一些注射和一些提供的类成提供的类

问题描述 投票:1回答:1

我开始使用匕首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,当我尝试访问它。有没有办法,我应该对所提供的顶级类做不同的方式?

附:我不认为这是相关的,但这里是我用以防万一它重要的组成部分:

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

    TopLevelClass getTopLevelClass();

}

谢谢!

java dagger-2
1个回答
0
投票

你有2种选择:

  • 利用构造函数注入,并让匕首创建和注入的对象(不加任何注解@Provides法)的对象将准备,而无需任何代码使用。这是匕首眼前一亮。
  • 创建对象自己和从@Provides注解的方法返回之前确保其正确设置

我不知道为什么你宁愿第二个选项,或者为什么你甚至会想使用字段注入的时候,您可以利用构造的,但是,当你发现了,田也不会,如果你手动构造注入宾语。生成的匕首代码都不会跑 - 你有这自己做。

我想到的一个方法是要求该组件,然后注入对象。

@Provides
TopLevelClass provideTopLevelClass(SecondaryClass2 class2, MyComponent component) {
    TopLevelClass tlc = new TopLevelClass(class2);
    component.inject(tlc);
    return  tlc;
}
© www.soinside.com 2019 - 2024. All rights reserved.