假设我有多个活动,每个活动都包含单独的Dagger2组件。因此FooActivity
有FooComponent
而BarActivity
有BarComponent
。我也有一些viewgroup,比如说BazViewGroup
可以在两个活动中使用,并且必须通过dagger graph接收一些依赖关系。将依赖项注入此视图组实例的最佳方法是什么,因为我们事先并不知道它属于哪个活动?
现在我有以下设置:
getComponent()
,该方法返回此活动中包含的组件每个组件都像
那样扩展界面public interface CanInjectIntoBazViewGroup {
void inject(BazViewGroup viewgroup);
}
在BazViewGroup constuctor中,我从中获取对activity get组件的引用,将其强制转换为CanInjectIntoBazViewGroup
并调用inject
方法。
有更好的方法吗?
答案 0 :(得分:1)
Dagger 2的最佳做法是不要滥用它(就像任何其他东西一样)。
因此,如果您已经拥有Activities
的组件,并且BazViewGroup
中都有Activities
的引用,那么我认为没有任何理由使用Dagger 2为了对此BazViewGroup
执行DI。
有两种情况。
ViewGroup以XML格式声明:
如果您在XML中声明BazViewGroup
并让Android为您充气,那么您可以执行“方法DI” - 在此对象上定义setXYZ()
等方法并传递XYZ
视图层次结构膨胀后的Activities
。
以编程方式创建ViewGroup:
如果以编程方式实例化ViewGroup
,则可以将其依赖项添加为构造函数参数。
这两种方法都不是那么干净,因为它们在Activity
和ViewGroup
的内部之间创建了一些耦合,但它比将ViewGroup
与Dagger框架耦合要好得多。
更简洁的方法是从ViewGroup
中删除这些依赖项。我猜你需要它们才能对用户交互执行某些操作,或查询数据,对吧?为什么不创建回调接口并将所有这些操作委托给封闭的Activity
?这样,如果您有一天重构业务逻辑,则自定义Views
不会受到影响。