如何使用Dagger?如何配置Dagger在我的Android项目中工作?
我想在我的Android项目中使用Dagger,但我发现它令人困惑.
编辑:Dagger2也从2015年04月15日开始,它更令人困惑!
[这个问题是一个"存根",我在我的答案中添加了更多关于Dagger1的知识,并且更多地了解了Dagger2.这个问题更多的是指导而不是"问题".
我在我的android应用程序中使用Dagger2 for DI.我发现我必须为每个使用@Inject字段的类编写inject方法.有没有办法我可以注入父类,这样我就不必在每个子类上调用注入?以活动为例.我有一个BaseActivity每个活动都延伸出来的.有没有办法可以在组件中为BaseActivity创建一个注入方法,只需在BaseActivity的onCreate中调用注入,子活动中的@inject字段会自动注入?
我正在构建一个具有一些功能的应用程序:ContentProvider,SyncAdapter,作业服务和相关的持久性逻辑.除此之外,还有UI的活动.我试图将所有所述功能放在一个单独的库模块中,因为从理论上讲它们的逻辑是独立的,可以被任何应用程序重用.
现在来了Dagger2.我的库的依赖图的第一个节点(主要组件)确实需要提供Context,并且必须从Application注入此Context,因为库范围与应用程序具有相同的生命周期.显然,要自包含,我的库不应该直接使用我的Application类.
这些是我想到的可能性:
这样做的正确方法是什么?
我有一个工作和图书馆项目.Dagger用于工作项目,几天前我决定在图书馆项目中使用Dagger.我为库项目配置了Eclipse Java Compiler和Annotation Processing设置,添加了必需的Dagger和JavaWriter JAR,在库项目中对模块进行了decalred.现在这两个项目都没有任何错误.
但是当我尝试在Android设备上运行应用程序时,它崩溃了:
java.lang.RuntimeException:
Unable to create application com.iqm.smartapp.AlarmsApplication:
java.lang.IllegalStateException:
Module adapter for class com.iqm.library.IQMLibraryModule could not be loaded.
Please ensure that code generation was run for this module.
Run Code Online (Sandbox Code Playgroud)
我认为这是因为在库项目中.apt_generated文件夹是空的!Dagger不会为库项目生成类.可能有一些IDE /项目配置错误.但是在工作和库项目中完全配置并且没有更多的想法,可能是错的.
所以我的问题是:是否有可能在Android库项目中使用Dagger?什么应该是正确的Eclipse配置启用需要代码生成?
提前致谢.
编辑:我创建了一个新的干净库项目,为Dagger设置并复制旧文件中的所有源文件.此时,新项目中的所有项目都按预期工作.奇怪的事情!
是否有可能让Dagger为你注射单身人士?
事实上,我只找到了一种手动为单身人士提供依赖关系的方法:
@Provides
@Singleton
public Dispatcher providesDispatcher(Context context, PPreferences preferences,
FileNameCache fileNameCache) {
return new Dispatcher(context, preferences, fileNameCache);
}
Run Code Online (Sandbox Code Playgroud)
这是定义单身人士的唯一方法吗?我更喜欢做的是以下内容,以便Dagger自己注入依赖项,但这样做会给我一个错误.
@Provides
@Singleton
public Dispatcher providesDispatcher(Dispatcher dispacher) {
return dispacher;
}
Run Code Online (Sandbox Code Playgroud)
也许还有另一种方法来定义单身,这将允许我注入其他单身人士吗?
任何帮助表示赞赏.
编辑: 我刚刚意识到我正在使用另一个Singleton进行第二种方法,但是当我将实现映射到接口时,情况略有不同:
@Provides
@Singleton
public Tracker providesTracker(TrackerImpl tracker) {
return tracker;
}
Run Code Online (Sandbox Code Playgroud)
TrackerImpl也注入了上面提到的PPreferences的实例.
当我尝试使用第二个示例创建Dispatcher时,这是我得到的错误:
error: Unknown error java.lang.IllegalStateException thrown by javac in graph validation: Dependency cycle:
0. com.example.test.Dispatcher bound by @Singleton/ProviderMethodBinding[provideKey="com.example.test.Dispatcher", memberskey="null"]
0. com.example.test.Dispatcher
Run Code Online (Sandbox Code Playgroud)