在将代码从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;
.
.
.
}
答案 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