Dagger 2子组件与组件依赖关系

布拉德利·坎贝尔

Dagger 1的plus()方法是我在以前的应用程序中经常使用方法,因此我了解到您可能希望拥有一个可以完全访问父图绑定的子组件的情况。

在什么情况下使用组件依赖关系而不是子组件依赖关系是有益的,为什么?

普拉韦尔·古普塔

组件依存关系-如果要使两个组件保持独立,请使用此选项。

子组件-当您要保持两个组件耦合时使用此组件。


我将使用下面的示例来说明Component依赖项Subcomponents需要注意该示例的一些要点是:

  • SomeClassA1可以不受任何依赖地创建。ModuleA提供和的实例SomeClassA1经由provideSomeClassA1()方法。
  • SomeClassB1没有不能创建SomeClassA1仅当将的一个实例作为参数传递给method时,ModuleB才能提供的实例SomeClassB1SomeClassA1provideSomeClassB1()
@Module
public class ModuleA {
    @Provides
    public SomeClassA1 provideSomeClassA1() {
        return new SomeClassA1();
    }
}

@Module
public class ModuleB {
    @Provides
    public SomeClassB1 provideSomeClassB1(SomeClassA1 someClassA1) {
        return new SomeClassB1(someClassA1);
    }
}

public class SomeClassA1 {
    public SomeClassA1() {}
}

public class SomeClassB1 {
    private SomeClassA1 someClassA1;

    public SomeClassB1(SomeClassA1 someClassA1) {
        this.someClassA1 = someClassA1;
    }
}

每当初始化组件/子组件声明时,Dagger都会将的实例SomeClassA1作为参数传递provideSomeClassB1()方法我们需要指导Dagger如何实现依赖关系。这可以通过使用Component依赖项Subcomponent来完成ModuleBModuleB

组件依赖性

请注意以下“组件依赖关系”示例中的以下几点:

  • ComponentB必须通过注释dependencies方法定义依赖项@Component
  • ComponentA不需要声明ModuleB这使两个组件保持独立。
public class ComponentDependency {
    @Component(modules = ModuleA.class)
    public interface ComponentA {
        SomeClassA1 someClassA1();
    }

    @Component(modules = ModuleB.class, dependencies = ComponentA.class)
    public interface ComponentB {
        SomeClassB1 someClassB1();
    }

    public static void main(String[] args) {
        ModuleA moduleA = new ModuleA();
        ComponentA componentA = DaggerComponentDependency_ComponentA.builder()
                .moduleA(moduleA)
                .build();

        ModuleB moduleB = new ModuleB();
        ComponentB componentB = DaggerComponentDependency_ComponentB.builder()
                .moduleB(moduleB)
                .componentA(componentA)
                .build();
    }
}

子组件

请注意SubComponent示例中的以下几点:

  • 由于ComponentB尚未定义对的依赖ModuleA,因此它不能独立存在。它取决于将提供的组件ModuleA因此,它具有@Subcomponent注释。
  • ComponentAModuleB通过接口方法声明componentB()这使两个组件耦合。实际上,ComponentB只能通过进行初始化ComponentA
public class SubComponent {
    @Component(modules = ModuleA.class)
    public interface ComponentA {
        ComponentB componentB(ModuleB moduleB);
    }

    @Subcomponent(modules = ModuleB.class)
    public interface ComponentB {
        SomeClassB1 someClassB1();
    }

    public static void main(String[] args) {
        ModuleA moduleA = new ModuleA();
        ComponentA componentA = DaggerSubComponent_ComponentA.builder()
                .moduleA(moduleA)
                .build();

        ModuleB moduleB = new ModuleB();
        ComponentB componentB = componentA.componentB(moduleB);
    }
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

Dagger2:使子组件的子组件可以访问父组件依赖项

来自分类Dev

依赖组件的 Dagger 注入

来自分类Dev

Dagger 2子组件注入错误

来自分类Dev

跨 Android 模块的 Dagger 2 子组件

来自分类Dev

Dagger 2组件依赖项不起作用

来自分类Dev

Dagger2 子组件错误 - 必须注释方法 ArrayAdapter

来自分类Dev

Dagger 2依赖关系是否可以注入?

来自分类Dev

DI与Dagger 2一起替换内置组件上的子组件

来自分类Dev

DI与Dagger 2一起替换内置组件上的子组件

来自分类Dev

Dagger 2的依赖注入

来自分类Dev

Dagger2范围,每个组件实例

来自分类Dev

具有多个依赖项的Dagger2组件

来自分类Dev

Dagger2-应用程序不能依赖于多个作用域组件

来自分类Dev

如何在 Android 上使用 Kotlin 获取 Dagger 2 模块中的组件依赖项?

来自分类Dev

Dagger - 为子组件构建器设置动态值

来自分类Dev

带有贡献者的 Dagger 子组件

来自分类Dev

如何在Dagger 2中将命名组件注入子图中?

来自分类Dev

Dagger 2依赖关系图不完整

来自分类Dev

如何通过Dagger2提供GoogleApiClient依赖关系?

来自分类Dev

Dagger 2 Singleton 和 Activity 级别的依赖关系

来自分类Dev

Dagger 2注入依赖链

来自分类Dev

如何避免在活动中设置我所有组件的模块以使用Dagger 2注入依赖项?

来自分类Dev

Android Dagger2,单例交叉组件

来自分类Dev

Dagger 2. 空测试组件未解决

来自分类Dev

android studio 中未生成 Dagger 2 组件

来自分类Dev

Java / IntelliJ无法识别Dagger2组件的“ Dagger”关键字

来自分类Dev

Dagger2不生成Dagger *类

来自分类Dev

将Dagger组件存储在静态字段中

来自分类Dev

如何使用 Dagger 覆盖组件的 Builder 界面

Related 相关文章

热门标签

归档