在Dagger我有时会看到有些组件只是扩展了一个接口,而其他的则使用dependencies.
例如,我们有一个基础组件:
@Singleton
@Component(modules={...})
public interface BaseComponent {
...
}
Run Code Online (Sandbox Code Playgroud)
版本 1:
@Singleton
@Component(modules={...})
public interface MyComponent extends BaseComponent {
...
}
Run Code Online (Sandbox Code Playgroud)
和版本 2:
@CustomScope
@Component(modules={...}, dependencies= BaseComponent.class)
public interface MyComponent {
...
}
Run Code Online (Sandbox Code Playgroud)
它们用于不同的场景吗?
不应使用接口扩展创建组件层次结构。说ComponentA有一些注射部位:
@Component
interface ComponentA {
void inject(ActivityA1 activityA1);
void inject(ActivityA2 activityA2);
}
Run Code Online (Sandbox Code Playgroud)
然后你写了一个ComponentB扩展ComponentA:
@Component
interface ComponentB extends ComponentA {
void inject(ActivityB activityB);
}
Run Code Online (Sandbox Code Playgroud)
因为ComponentB继承自 的方法ComponentA,成员注入器 forActivityA1和ActivityA2将不合需要地生成在ComponentB.
如果要创建组件层次结构,执行此操作的标准方法是使用子组件或使用依赖组件。
例外:您可以使用接口扩展来制作测试组件。这是比扩展模块更好的解决方案。有关官方文档的解释,请参见此处:
@Component(modules = {
OAuthModule.class, // real auth
FooServiceModule.class, // real backend
OtherApplicationModule.class,
/* … */ })
interface ProductionComponent {
Server server();
}
@Component(modules = {
FakeAuthModule.class, // fake auth
FakeFooServiceModule.class, // fake backend
OtherApplicationModule.class,
/* … */})
interface TestComponent extends ProductionComponent {
FakeAuthManager fakeAuthManager();
FakeFooService fakeFooService();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1544 次 |
| 最近记录: |