我正在使用Dagger在Android应用程序中进行依赖项注入。

我有2个应用程序类,我们称它们为A和B。B扩展A扩展android.app.Application

具有对任何应用程序通用的职责和依赖性。 B具有特定于当前应用程序的职责和依赖性。

我希望能够有两个模块,分别是AModuleBModule,A使用前者注入自身,而B使用后者注入。

问题在于,似乎BModule必须在编译时引用A的类,否则会引发运行时错误。因此,这是BModule避免发生错误的样子(请注意injects注释字段的值):

@Module(injects = {A.class}, library = true, complete = false)
public class BModule {
   ...
}


但是我宁愿BModule只知道B,像这样:

@Module(injects = {B.class}, library = true, complete = false)
public class BModule {
   ...
}


我执行此操作时抛出的错误实际上表示正在注入的实例(A)不是已知的BModule负责注入的类。

有没有一种方法可以实现而不会产生运行时错误?

谢谢!

最佳答案

使用模块扩展名:

  public class A {
      @Inject
      AA a;
  }

  public class B extends A {
      @Inject
      BB b;
  }


和模块:

  @Module ( injects = A.class )
  public class AModule {
      @Provides
      public AA getAA() {
         return new AA();
      };
  }

  @Module ( overrides = true, includes = AModule.class, injects = B.class )
  public class BModule {
      @Provides
      public BB getBB() {
         return new BB();
      };
  }

10-06 14:03