在将代码从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;
.
.
.
}发布于 2017-06-28 19:41:18
您可以让Dagger注入一个MembersInjector,然后使用它将依赖项注入到您自己的对象中……
public class JobManager {
private Context context;
@Inject
public JobManager(Context context, MembersInjector<MyJob> jobInjector) {
this.context = context;
}
public void postJob(String jobId) {
MyJob myJob = deserializePersistedJobFromFile(jobId);
jobInjector.inject(myJob);
}
.
.
.
}发布于 2017-06-28 16:49:09
你在使用“旧”方法时有没有遇到什么问题,让你想要换成“新”方法?
在使用静态AndroidInjector类执行依赖注入时,我找不到一个真正的优点,但它确实增加了代码的复杂性。
因此,如果您没有非常明确的理由朝这个方向发展,我建议您继续使用“旧的”工作方法。
至于注入到非活动/片段类中,我认为你不应该使用依赖注入框架。仅将Dagger用于注入到应用程序、活动、片段和服务中。更多信息可以在这篇文章中找到:Dependency Injection in Android。
发布于 2017-06-28 16:43:56
在手机上写下这篇文章,所以对于任何打字错误,我深表歉意。
MyJob需要一个接受ApiService的@Inject(ed)构造函数,而不是成员注入,这不是很有意义吗?为什么MyJob不能有自己的构造函数?(不熟悉这是不是Android SDK类)。如果这不是答案,那么我有另一个观察结果,那就是你的JobManager似乎做了JobScheduler做的事情?除非它仅仅是一个术语的混淆(即两个“工作”)
除了Android和它的生命周期,唯一性,依赖反转最常见的用途是构造函数注入。学习Android框架中的依赖注入模式并不是最好的介绍,你会被“对编译器撒谎”的依赖注入框架功能所吸引,该功能只是为了帮助移出遗留的代码库(c.f。Dagger 1的静态注入或Guide的“私有”成员注入)。
顺便说一句,我避免使用"Android Dagger“,因为它似乎与模块化的代码分离背道而驰。我认为我在这里还有更多的东西要学,但现在"Android Dagger“的样板干扰优势被我对松散耦合的功能模块的需求所抵消,以支持Instant Apps和一个完全更模块化的代码库。
希望这能有所帮助。
https://stackoverflow.com/questions/44796932
复制相似问题