多个独立组件注入

gaa*_*a87 5 java android dependency-injection dagger-2

我正在处理的Android项目的匕首配置:注意:我已经在需要的地方提供了所有需要的@ Component,@ Module,@ Provide注释.

MainActivity {

@Inject A a;
@Inject B b;

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

ComponentX-> ModuleA ->providerA
ComponentY -> ModuleB -> providerB
Run Code Online (Sandbox Code Playgroud)

如您所见,这两个完全独立的组件无论如何都不相互关联,除了在注射点.

在编译期间,我收到以下错误:

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

我错误地认为在使用匕首2时可以使用多个组件,或者应用程序应该使用一个负责所有注射的大组件?

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

Pau*_*fin 7

您不必拥有单个组件,有多种方法可以模块化它们,但是您创建或注入值的每个对象必须具有由单个组件提供的所有值.

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

@Component(dependencies = ComponentX.class)
interface ComponentY {
    void inject(MainActivity activity);
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

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

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