代码之家  ›  专栏  ›  技术社区  ›  Michel Feinstein

为什么在Dagger中双重注入Android应用程序?

  •  0
  • Michel Feinstein  · 技术社区  · 6 年前

    GithubBrowerSample ,我不明白双重注射的意义 githubApp

    那不是吗 inject 方法够了吗?为什么这两个词必须在同一句话里?

    public interface AppComponent {
        @Component.Builder
        interface Builder {
            @BindsInstance Builder application(Application application);
            AppComponent build();
        }
        void inject(GithubApp githubApp);
    }
    

    他们使用它就像:

    public static void init(GithubApp githubApp) {
            DaggerAppComponent.builder().application(githubApp)
                    .build().inject(githubApp);
    
    2 回复  |  直到 6 年前
        1
  •  2
  •   Jeff Bowman    6 年前

    As Thomas Broyer described ,您需要设置两个不同的方向:希望匕首图知道如何访问应用程序实例,以及希望从依赖关系图中访问某些绑定。

    这个 @BindsInstance 生成器中的行为应用程序集创建一个绑定,绑定到传入的实例。听起来你明白这部分。

    使用

    @Singleton @Component(/* ... */) interface AppComponent {
        // [builder snipped out here]
    
        fun getDep1(): Dep1
        fun getDep2(): Dep2
        fun getDep3(): Dep3
    }
    

    然后你把它们作为应用程序创建的一部分。

    var appComponent = DaggerAppComponent.builder().application(githubApp).build()
    var dep1 = appComponent.getDep1()
    var dep2 = appComponent.getDep2()
    var dep3 = appComponent.getDep3()
    // Use dep1, dep2, and dep3 here.
    

    但是,您也可以创建一个arg方法,它通常是 void inject . 这将填充所有 @Inject -注释字段和调用 -在您传入的实例上添加注释的方法。如果GitHubApp有 -带批注的字段( and it does ),呼叫

    DaggerAppComponent.builder().application(githubApp)
        .build().inject(githubApp)
    

    …这就是你在演示中看到的。

        2
  •  2
  •   Thomas Broyer    6 年前

    这个 @BindsInstance @Inject Application 它在依赖关系图中找到。

    第二个请求Dagger向它的 @Inject -带注释的字段和方法。这是依赖关系图的根。

    从技术上讲,组件方法可以调用任意多次,而生成器方法只能调用一次。