如何从不同的Dagger2组件注入同一个类?

时间:2016-10-06 09:37:54

标签: android dagger-2

假设我有多个活动,每个活动都包含单独的Dagger2组件。因此FooActivityFooComponentBarActivityBarComponent。我也有一些viewgroup,比如说BazViewGroup可以在两个活动中使用,并且必须通过dagger graph接收一些依赖关系。将依赖项注入此视图组实例的最佳方法是什么,因为我们事先并不知道它属于哪个活动?

现在我有以下设置:

  1. 每个活动都会公开方法getComponent(),该方法返回此活动中包含的组件
  2. 每个组件都像

    那样扩展界面
    public interface CanInjectIntoBazViewGroup {
        void inject(BazViewGroup viewgroup);
    }
    
  3. 在BazViewGroup constuctor中,我从中获取对activity get组件的引用,将其强制转换为CanInjectIntoBazViewGroup并调用inject方法。

  4. 有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

Dagger 2的最佳做法是不要滥用它(就像任何其他东西一样)。

因此,如果您已经拥有Activities的组件,并且BazViewGroup中都有Activities的引用,那么我认为没有任何理由使用Dagger 2为了对此BazViewGroup执行DI。

有两种情况。

ViewGroup以XML格式声明:

如果您在XML中声明BazViewGroup并让Android为您充气,那么您可以执行“方法DI” - 在此对象上定义setXYZ()等方法并传递XYZ视图层次结构膨胀后的Activities

以编程方式创建ViewGroup:

如果以编程方式实例化ViewGroup,则可以将其依赖项添加为构造函数参数。

这两种方法都不是那么干净,因为它们在ActivityViewGroup的内部之间创建了一些耦合,但它比将ViewGroup与Dagger框架耦合要好得多。

更简洁的方法是从ViewGroup中删除这些依赖项。我猜你需要它们才能对用户交互执行某些操作,或查询数据,对吧?为什么不创建回调接口并将所有这些操作委托给封闭的Activity?这样,如果您有一天重构业务逻辑,则自定义Views不会受到影响。