Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/183.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何从不同的Dagger2组件注入同一类?_Android_Dagger 2 - Fatal编程技术网

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

Android 如何从不同的Dagger2组件注入同一类?,android,dagger-2,Android,Dagger 2,假设我有多个活动,每个活动都包含单独的Dagger2组件。因此FooActivity具有FooComponent和BarActivity具有BarComponent。我还有一些视图组,比如说BazViewGroup,可以在这两个活动中使用,并且必须通过匕首图接收一些依赖项。既然我们事先不知道它属于什么活动,那个么向该视图组的实例中注入依赖项的最佳方法是什么 现在我有以下设置: 每个活动都公开方法getComponent(),该方法返回此活动中包含的组件 每个组件都像这样扩展接口 public i

假设我有多个活动,每个活动都包含单独的Dagger2组件。因此
FooActivity
具有
FooComponent
BarActivity
具有
BarComponent
。我还有一些视图组,比如说
BazViewGroup
,可以在这两个活动中使用,并且必须通过匕首图接收一些依赖项。既然我们事先不知道它属于什么活动,那个么向该视图组的实例中注入依赖项的最佳方法是什么

现在我有以下设置:

  • 每个活动都公开方法
    getComponent()
    ,该方法返回此活动中包含的组件
  • 每个组件都像这样扩展接口

    public interface CanInjectIntoBazViewGroup {
        void inject(BazViewGroup viewgroup);
    }
    
  • 在BazViewGroup构造函数中,我从中获取对activity get组件的引用,将其强制转换为
    CanInjectionToBazViewGroup
    并调用
    inject
    方法


  • 有更好的方法吗?

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

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

    有两种情况

    视图组是用XML声明的:

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

    以编程方式创建视图组:

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

    这两种方法都不是很干净,因为它们在
    活动
    视图组
    的内部之间创建了一些耦合,但这比将
    视图组
    耦合到Dagger框架要好得多

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