如何使用Dagger?如何配置Dagger在我的Android项目中工作?
我想在我的Android项目中使用Dagger,但我发现它令人困惑.
编辑:Dagger2也从2015年04月15日开始,它更令人困惑!
[这个问题是一个"存根",我在我的答案中添加了更多关于Dagger1的知识,并且更多地了解了Dagger2.这个问题更多的是指导而不是"问题".
Dagger 2即将到来,但可用的示例甚至不能立即编译,文档是Dagger 1的复制粘贴替换.
有没有人在Google的Dagger 2上有适当的应用程序示例?
我可能错过了一些东西,但我认为像@Singleton这样的Scopes用来定义"范围生命周期".
我在Android应用程序中使用Dagger 2(但我不认为这个问题与Android有关).
我有1个模块:
@Module public class MailModule {
@Singleton @Provides public AccountManager providesAccountManager() {
return new AccountManager();
}
@Singleton @Provides public MailProvider providesMailProvider(AccountManager accountManager) {
return new MailProvider(accountManager);
}
}
Run Code Online (Sandbox Code Playgroud)
我有两个不同的组件,@Singleton
范围:
@Singleton
@Component(modules = MailModule.class)
public interface LoginComponent {
public LoginPresenter presenter();
}
@Singleton
@Component(
modules = MailModule.class
)
public interface MenuComponent {
MenuPresenter presenter();
}
Run Code Online (Sandbox Code Playgroud)
两者都有,MenuPresenter
并且LoginPresenter
有一个@Inject
构造函数.虽然MenuPresenter期望MailProvider
作为参数,但LoginPresenter需要AccountManager
:
@Inject public MenuPresenter(MailProvider mailProvider) { ... }
@Inject public LoginPresenter(AccountManager …
Run Code Online (Sandbox Code Playgroud) 我正在从Dagger 2.11中探索新的dagger.android.我希望不必创建自定义范围注释@PerActivity
.到目前为止,我能够做到以下几点:
1)定义应用程序范围单例并将它们注入活动.
2)定义活动范围非单例依赖关系,并使用它们将它们注入到它们的活动中 @ContributesAndroidInjector
我无法弄清楚的是如何使用它的应用程序范围Singleton和Activity范围非单例.
在下面的示例中,我想要我的活动范围MyActivityDependencyA
并MyActivityDependencyB
可以访问SingletonMyActivityService
以下设置导致:
错误:(24,3)错误:com.example.di.BuildersModule_BindMyActivity.MyActivitySubcomponent(unscoped)可能不引用作用域绑定:@Singleton @Provides com.example.MyActivityService com.example.MyActivitySingletonsModule.provideMyActivityService()
这是我的设置.注意,我定义了单独的MyActivitySingletonsModule
, MyActivityModule
因为我不能在同一个Module文件中混合使用Singleton和非Singleton依赖项.
@Module
public abstract class BuildersModule {
@ContributesAndroidInjector(modules = {MyActivitySingletonsModule.class, MyActivityModule.class})
abstract MyActivity bindMyActivity();
}
}
Run Code Online (Sandbox Code Playgroud)
和
@Module
public abstract class MyActivityModule {
@Provides
MyActivityDependencyA provideMyActivityDependencyA(MyActivityService myActivityService){
return new MyActivityDependencyA(myActivityService);
}
@Provides
MyActivityDependencyB provideMyActivityDependencyB(MyActivityService myActivityService) {
return new MyActivityDependencyB(myActivityService);
}
}
Run Code Online (Sandbox Code Playgroud)
和
@Module
public abstract class MyActivitySingletonsModule {
@Singleton
@Provides
MyActivityService provideMyActivityService() {
return new MyActivityService();
} …
Run Code Online (Sandbox Code Playgroud)