Dagger2组件通用注入方法

时间:2016-03-03 22:41:43

标签: java android dagger-2

我将我的应用从Dagger1.0转换为dagger2.0,并且有一个包含许多void inject(Activity/Fragment/Receiver/etc object)方法的应用组件。

使用dagger 1.0我只能做objectGraph.inject(Object object)但现在我的组件必须为每个注入依赖关系的类提供一个方法。

为什么我不能只拥有一个具有一种方法的组件:<T> void inject(T t);

供参考: 我的组件:


public interface AppComponent {

    void inject(MyFirstActivity activity);

    void inject(MySecondActivity activity);

    void inject(MyFirstFragment fragment);

    void inject(MySecondFragment fragment);

    ...
}

我想要的组件:


public interface AppComponent {
   <T> void inject(T object);
}

1 个答案:

答案 0 :(得分:3)

  

为什么我的组件只有一种方法:<T> void inject(T t);

因为dagger-2使用代码生成并且需要在编译时知道类型信息。没有它,就无法确定哪些依赖项T需要 - 因此代码生成是不可能的。

如果编译第一个组件并查看生成的Dagger*Component源代码,您将看到每个inject方法都有自己的工厂方法,为给定的所有依赖项提供输入

注入子类时也是如此。您可以在组件文档中查看 A note about covariance 段落。因为超类类型是已知的,所以dagger可以在超类中注入成员,但它不会注入潜在子类型的成员。同样,因为dagger-2依赖于编译时代码生成,所以这是不可能的。