gpt4 book ai didi

android - 如何从不同的 Dagger2 组件注入(inject)同一个类?

转载 作者:行者123 更新时间:2023-11-29 01:15:38 24 4
gpt4 key购买 nike

假设我有多个 Activity ,每个 Activity 都包含单独的 Dagger2 组件。所以 FooActivityFooComponentBarActivityBarComponent。我还有一些 View 组,比方说 BazViewGroup 可以在两个 Activity 中使用,并且必须通过 Dagger 图接收一些依赖项。由于我们事先不知道它属于哪个 Activity ,因此将依赖项注入(inject)此 View 组实例的最佳方法是什么?

现在我有以下设置:

  1. 每个 Activity 都公开方法 getComponent(),该方法返回包含在该 Activity 中的组件
  2. 每个组件都像扩展接口(interface)一样

    public interface CanInjectIntoBazViewGroup {
    void inject(BazViewGroup viewgroup);
    }
  3. 在 BazViewGroup 构造函数中,我获得了对 Activity 的引用,从中获取组件,将其转换为 CanInjectIntoBazViewGroup 并调用 inject 方法。

有更好的方法吗?

最佳答案

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

因此,如果您的Activities 已经有了组件,并且您在两个Activities 中都有对BazViewGroup 的引用,那么我不看不出有任何理由使用 Dagger 2 来对此 BazViewGroup 执行 DI。

有两种情况。

ViewGroup 在 XML 中声明:

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

您以编程方式创建 ViewGroup:

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

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

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

关于android - 如何从不同的 Dagger2 组件注入(inject)同一个类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39892547/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com