我可以使用Dagger 2提供MembersInjector <t>的实现吗?

时间:2018-01-26 09:30:25

标签: dagger-2

我正在尝试用Dagger-2取代Guice。到目前为止,一切看起来都很好,但有一件事我找不到惯用的解决方案。

假设我有一个我无法扩展且无法控制代码的类。另外,我无法创建该类的实例。实例将由另一个框架创建 - 但不是初始化的。我偶然发现了MembersInjector<T>接口,但它似乎只处理带注释的类。我正在寻找一种方法来提供MemebersInjector<Type>的实现(参见下面的示例代码)。

final class Type {
  A a;
  B b;

  public Type() {
  }

  public void initialize(A a, B b) {this.a=a; this.b=b};
} 

我的组件和模块可以提供AB

我正在寻找的是像

@Component(modules = MyModule.class)
interface MyComponent {
  Type inject(Type t);
}

@Component(modules = MyModule.class)
interface MyComponent {
  MembersInjector<Type> getTypeInjector();
}

以及提供我自己的MembersInjector实现方式。

我试过这样的事情

@Module
class MyModule {
  @Provides
  MembersInjector<Type> provideTypeInjector(A a, B b) {
    return instance -> {
      instance.initialize(a, b);
    }
  }
}
但是Dagger-2并不满意。

知道如何使这项工作吗?

1 个答案:

答案 0 :(得分:1)

除了创建自己的POJO之外,我不认为这是一种惯用的方法,而且这可能很好。

@Component inject(T)方法或MembersInjector<T>实例的值是您是如何根据T&#请求Dagger写入的对象的方式39; s @Inject注释。如果Dagger没有为您扫描课程并为您生成对象,那么您无论如何都要负责填充对象,因此您也可以编写自己的初始化程序。

class YourTypeInitializer { // nothing to extend or implement
  private final Provider<A> aProvider;
  private final Provider<B> bProvider;

  @Inject YourTypeInitializer(Provider<A> aProvider, Provider<B> bProvider) {
    this.aProvider = aProvider;
    this.bProvider = bProvider;
  }

  public YourType inject(YourType instance) {
    instance.initialize(aProvider.get(), bProvider.get());
    return instance;  // for convenience
  }
}

或使用现场注射:

class YourTypeInitializer {
  @Inject Provider<A> aProvider;
  @Inject Provider<B> bProvider;
  @Inject YourTypeInitializer() {}

  public YourType inject(YourType instance) {
    instance.initialize(aProvider.get(), bProvider.get());
    return instance;  // for convenience
  }
}

然后,注入MembersInjector<YourType>,而不是注入YourTypeInitializer;而不是致电yourComponent.inject(yourTypeInstance),只需致电yourComponent.getYourTypeInitializer().inject(yourTypeInstance)。它有点样板,但如果没有@Inject注释,那么Dagger很少能为你做替代。