java - 多个独立组分注入(inject)

标签 java android dependency-injection dagger-2

我正在处理的 android 项目的 Dagger 配置: 注意:我已经在需要的地方提供了所有需要的@Component、@Module、@Provides 注释。

MainActivity {

@Inject A a;
@Inject B b;

 onCreate(){
    ComponentX.inject(this);
    ComponentY.inject(this);
 } 
}

ComponentX-> ModuleA ->providerA
ComponentY -> ModuleB -> providerB

如您所见,这是两个完全独立的组件,除了在注入(inject)点之外,彼此毫无关联。

在编译过程中出现以下错误:

In file A.java
error: B cannot be provided without an @Provides- or @Produces-annotated method.
MainActivity.b
[injected field of type: B b]

我是否错误地认为在使用 dagger 2 时可以使用多个组件,或者应用程序应该使用一个负责所有注入(inject)的大组件?

任何人都可以帮助我了解我哪里出错了吗?

最佳答案

您不必只有一个组件,有多种方法可以将它们模块化,但是您创建的每个对象或向其中注入(inject)值的每个对象都必须具有由单个组件提供的所有值。

重组代码的一种方法是让 ComponentY 依赖于 ComponentX,反之亦然,例如

@Component(dependencies = ComponentX.class)
interface ComponentY {
    void inject(MainActivity activity);
}

或者如果 ComponentX 和 ComponentY 彼此完全正交,您可以创建第三个组件,比如 ComponentZ。

@Component(dependencies = {ComponentX.class, ComponentY.class})
interface ComponentZ {
    void inject(MainActivity activity);
}

或者您可以重用模块,例如

@Component(modules = {ModuleA.class, ModuleB.class})
interface ComponentZ {
    void inject(MainActivity activity);
}

您决定如何拆分它在很大程度上取决于您的代码结构。如果组件 X 和 Y 可见但模块不可见,则使用组件依赖项,因为它们(和模块依赖项)实际上是组件的实现细节。否则,如果模块可见,则简单地重用它们。

我不会为此使用作用域,因为它们实际上用于管理具有不同生命周期的对象,例如与特定用户关联的对象,其生命周期是从用户登录到注销的时间,或者特定请求的生命周期。如果它们确实具有不同的生命周期,那么您正在考虑使用作用域和子组件。

关于java - 多个独立组分注入(inject),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32341839/

相关文章:

Java - 使屏幕进入休眠状态(或屏幕保护程序)

java - JNA 将 Java String 映射到 PCWSTR

testing - 在 Grails Spock 规范测试中注入(inject)依赖项

java - 尝试使用 junit5 和 mockito 模拟 byte[] 值时出现空值

java - MPAndroidChart LineChart 仅在 LineData 上显示

android - 您在哪些硬件设备上测试您的 Android 应用程序?

android - 以编程方式在 recyclerview onbindView 适配器中添加 textview

java - 在一个语句中一次向 HashMap 添加多个条目

c# - IoC - 控制 "Invert"到哪里去了? (它去哪里?)

forms - 如何在我的类型类中访问我的服务(DependencyInjection)?