从Dagger 2到Android Dagger 2.11的端口

时间:2017-06-28 08:07:35

标签: android dagger-2 dagger

在将代码从Dagger 2移植到Android Dagger 2.11时,我无法理解如何设置一些东西。在Dagger 2中,设置是这样的:

public class App extends Application {

    @Override
    public void onCreate() {
        super.onCreate();

        this.initializeInjector();
    }

    private void initializeInjector() {

        //this class should be auto-generated by Dagger on build
        this.applicationComponent = DaggerApplicationComponent.builder()
                .applicationModule(new ApplicationModule(this))
                .netModule(new NetModule())
                .build();
    }

    public ApplicationComponent getApplicationComponent() {
        return this.applicationComponent;
    }
}

然后您可以访问applicationComponent,并且可以使用:

注入任何对象

getApplicationComponent().inject(MyCustomObject);

在Android Dagger 2.11中,你不再那样做了。对于活动和片段,您可以使用AndroidInjector.inject()方法注入,但其他类型呢?我们来看下面的例子。我们有一个可以发布工作的JobManager。作业将持久保存到文件中,应在发布时将其首先反序列化。问题是它的依赖关系当然没有设置。所以问题是:怎么做?

public class JobManager {

    private Context context;

    @Inject
    public JobManager(Context context) {
        this.context = context;
    }

    public void postJob(String jobId) {

        MyJob myJob = deserializePersistedJobFromFile(jobId);


        //((App) context).getApplicationComponent().inject(myJob); //This was the old way of doing injection
        AndroidInjector.inject(myJob); //This doesn't work - what to do now?

    }

    .
    .
    .

}

public class MyJob {

    @Inject
    ApiService apiService;

    .
    .
    .
}

5 个答案:

答案 0 :(得分:1)

您是否遇到过“旧”方法的问题,这会让您想要转移到“新”方法?

我在使用静态AndroidInjector类执行依赖注入方面找不到一个真正的优势,但它确实增加了代码的复杂性。

因此,如果你没有一个非常具体的理由朝这个方向前进,我建议继续采用“旧的”工作方法。

至于注入非Activity / Fragment类,我认为你不应该使用DI框架。使用Dagger仅注入应用程序,活动,片段和服务。这篇文章提供了更多信息:Dependency Injection in Android

答案 1 :(得分:1)

你可以让Dagger注入一个MembersInjector<T>然后用它来将依赖项注入到你自己的对象中......

ApplicationController

答案 2 :(得分:0)

在手机上写这个,为任何拼写错误道歉。

TL; DR如果MyJob需要一个采用ApiService而不是成员注入的@Inject(ed)构造函数,那么这没有意义吗? MyJob有没有理由拥有它自己的构造函数? (如果这是Android SDK类,则不熟悉)。如果那不是答案,那么我还有另一个观察结果,即JobManager似乎做了JobScheduler所做的事情?除非它只是一个术语混淆(即两个&#34;工作&#34;)

在Android之外,它的生命周期唯一性依赖性反转最常见的用途是构造函数注入。在Android框架中学习DI模式并不是最好的介绍,你会陷入编译器的困境中。 DI框架功能旨在简单地帮助移除遗留代码库(例如,Dagger 1&#39;静态注入或指南&#39;私有&#39;成员注入)。

作为旁注,我已经避免转向&#34; Android Dagger&#34;因为它似乎违背了代码的模块化分离。我想我还有更多要在这里学到的东西,但是现在是&#34; Android Dagger&#34;我需要松散耦合的功能模块来支持Instant Apps和更加模块化的代码库。

希望有所帮助。

答案 3 :(得分:0)

我写这篇文章应该对你有所帮助。它链接到Github上的示例代码。

https://proandroiddev.com/exploring-the-new-dagger-android-module-9eb6075f1a46

密切关注AppModule以及它如何跟踪application,以便您可以将application.getApplicationContext()传递给JobManager

的构造函数

答案 4 :(得分:0)

使用dagger android库有优势:

1)使用dagger违反依赖注入原则,类不应该知道如何注入依赖关系,这个违规可以使用dagger android library修复

2)Dagger代码可以与android组件分离。

3)可以实现清洁代码,因为您不需要初始化dagger组件并在Android组件中调用注入方法,从而创建易于维护的应用程序。

你可以使用dagger android组件(如DaggerActivity,DaggerApplication和DaggerFragment)将dagger与android分离,并将AndroidInjection.inject()调用移动到中心位置,而不是通过使用活动生命周期回调来调用每个活动和片段应用

你可以阅读关于dagger android的详细解释 http://www.zoftino.com/android-framework-classes-dependency-injection-using-dagger-android