Dagger 2扩展接口与依赖组件

时间:2018-04-11 07:25:27

标签: dagger-2

Dagger我有时会看到有些组件只是扩展了界面,而其他组件则使用dependencies

例如,我们有一个基本组件:

@Singleton
@Component(modules={...})
public interface BaseComponent {
    ...
}

版本1:

@Singleton
@Component(modules={...})
public interface MyComponent extends BaseComponent {
    ...
}

版本2:

@CustomScope
@Component(modules={...}, dependencies= BaseComponent.class)
public interface MyComponent {
    ...
}

它们是否用于不同的场景?

1 个答案:

答案 0 :(得分:2)

不应使用接口扩展创建组件层次结构。说ComponentA有一些注射部位:

@Component
interface ComponentA {

    void inject(ActivityA1 activityA1);

    void inject(ActivityA2 activityA2);

}

你写了ComponentB ComponentA

@Component
interface ComponentB extends ComponentA {

   void inject(ActivityB activityB);

}

由于ComponentB会使ComponentA中的方法失败,ActivityA1ActivityA2的成员注入器将在ComponentB中生成。

如果要创建组件层次结构,标准方法是使用subcomponents或使用dependent components

异常:您可以使用接口扩展来制作测试组件。这是比扩展模块更好的解决方案。有关官方文档的解释,请参阅here

@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();
}