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时可以使用多个组件,或者应用程序应该使用一个负责所有注射的大组件?
任何人都可以帮我理解我哪里出错了?
您不必拥有单个组件,有多种方法可以模块化它们,但是您创建或注入值的每个对象必须具有由单个组件提供的所有值.
重构代码的一种方法是使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是可见的但模块不是那么使用组件依赖性,因为它们(和模块依赖性)实际上是组件的实现细节.否则,如果模块可见,则可以简单地重复使用它们.
我不会使用范围,因为它们实际上用于管理具有不同生命周期的对象,例如与特定用户相关联的对象,其生命周期是从用户登录到注销时的时间,或特定请求的生命周期.如果他们确实有不同的生命周期,那么您正在考虑使用范围和子组件.
| 归档时间: |
|
| 查看次数: |
982 次 |
| 最近记录: |