首页 > 解决方案 > Dagger 组件是否绑定到实例化它的对象?

问题描述

我一直在我的项目中使用 Dagger 2。我知道作用域对象的生命周期与组件的生命周期相同(具有相同的作用域)。那么组件的寿命呢?

例如,我有一个组件:

@MyApp
@Component(modules = {
        ApplicationModule.class})
public interface ApplicationComponent {
    // Injection methods
    void inject(MyApplication mainApplication);
}

我通过以下方式构建组件:

public class MyApplication extends Application {

   @Override
    public void onCreate() {
        super.onCreate();
        buildApplicationComponent();
        mApplicationComponent.inject(this);
    }

    private void buildApplicationComponent() {
        mApplicationComponent = DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(this))
                .build();
    }

}

目前,构建组件的代码在Application类中。但是,如果我在其中构建组件FragmentApplicationComponent具有与片段相同的生命周期并且如果我在Application类中执行它,那么组件将具有与整个应用程序相同的生命周期吗?或者如何定义组件的生命周期?

标签: androiddagger-2

解决方案


它是纯Java。无论在哪里,你都有对象。该对象为您提供依赖项。如果您使用相同的实例,您将具有相同的依赖项或基本相同的“范围/生命周期”。如果您在某处创建新对象,则意味着它可以提供新的其他对象\依赖项,以便“另一个范围/生命周期”。如果您在不同对象之间共享对象(您在 Application 类中创建它,但在另一个片段中重用它),您将处于“相同的范围/生命周期”中。

但总的来说,我在这里只看到使用 Dagger 2 的“旧方式”。这就是你的课程应该如何在任何地方结束。无需查找对任何组件等的引用,也无需尝试自行实例化它们或在 Fragments 或 Actvities 中自行清除它们。你在一个地方有一些 Dagger 2 的代码,然后你的类中有一些注释“它们可以完成你的项目的真正工作”。这两个部分之间不需要复杂的“连接”,我在这里看到很多这样的案例,这些案例是可追溯到 2016-2017 年的教程的一部分......

class Repostory @Inject constructor(
private val dependency1: Dependency1 
) {}

class Activity or Fragment {
@Inject lateinit var dependency2: Dependency2
}

这是正确使用 Dagger2 的一个很好的例子。

https://github.com/google/iosched

这是一篇关于该应用程序的文章:

https://medium.com/@JoseAlcerreca

Jose Alcerreca 是负责制定 Android 应用程序编写指南的 Google Lead Devs 之一。

@Module
abstract class ActivityBindingModule { 
  @ActivityScoped
    @ContributesAndroidInjector(modules = [MainActivityModule::class])
    internal abstract fun mainActivity(): MainActivity
}

试着编译这样的东西。我给你的应用程序中有完全相同的课程。检查生成的代码以及文档。如果你看到 ContributesAndroidInjector 有解释:

为此方法的返回类型生成一个 {@link AndroidInjector}。注入器是用 {@link dagger.Subcomponent} 实现的,将是 {@link dagger.Module} 组件的子组件。

如果您查看 AndroidInjector 文档,您会看到它是在 Activity 中注入的那个。这将是实现:

@Subcomponent(modules = {MainActivityModule.class})
  @ActivityScoped
  public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
  }

所以一般来说,当一个新的活动开始时,这些注释会为你带来魔力。他们创建子组件,他们使用它,当活动生命周期结束时,子组件也死了。Dagger 清除引用。Dagger 知道 Activity 或 Fragments 等是如何工作的。当您在 Activity 中创建组件、使用它、自己调用注入时,有一种旧方法。或者在 AppClass 中放置一些组件,然后在你的 onw 上清除它。但是现在有更多的注释。


推荐阅读