Dagger 2 扩展接口 vs 依赖组件

Rgf*_*Iff 3 dagger-2

在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)

它们用于不同的场景吗?

Dav*_*son 5

不应使用接口扩展创建组件层次结构。说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)

  • 我不会说 ComponentB 中的那些成员注入器一定是不可取的。这就是您在测试中使用 ComponentB 的方式。请参阅文档中的“选项 2:单独的组件配置”:https://google.github.io/dagger/testing (2认同)