是否有可能让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) 该匕首文档页说:
要充分利用编译时验证,请创建一个包含应用程序所有模块的模块。
这留下了一些需要回答的问题:
我正在调整我的项目以使用 DI - 特别是 Dagger。我在注入类时没有问题,但是如何“注入”运行时生成的变量?
说,我想存储用户的登录会话对象,其中包含诸如api-token、之类的数据loggedUsername。当用户成功登录时,这个对象在运行时生成,在另一个负责这样做的类中。
作为一个例子,我想要的是简单地做这样的事情:
public class FooPresenter {
...
Session mSession;
@Inject FooPresenter(Session session, ...) {
mSession = session;
...
}
...
}
Run Code Online (Sandbox Code Playgroud)
提前致谢!
我想知道如何在活动之间共享子组件?
假设我有一个与Application一起使用的全局AppComponent.
当用户实际登录我的应用程序时,我希望有一个UserComponent,它存在于多个活动中.
当用户登录时,我的应用程序会创建一个UserComponent,其他活动必须从某个地方检索,但我不知道什么是最好的"某处".
我应该将UserComponent存储在Application中并创建一个getter和一个重置组件的方法吗?我应该将此组件放在ApplicationModule内的"holder"对象中以及每个子活动中,通过从ApplicationComponent获取"holder"来检索我的组件吗?我应该将它存储在静态字段中吗?我应该做别的吗?
我正在尝试在我的Android应用程序中使用Dagger来简化依赖注入.看起来Dagger 2.0不支持抛出异常的构造函数.这个问题有方法解决吗?
重构和创建抛出异常的init方法似乎不可行,因为必须在整个依赖对象链上调用init重新引入了匕首解决的问题.
在我的nano项目中,我决定用命令映射替换大讨厌的switch语句.现在我正在整理我的代码,我想创建提供程序,为我提供填充的地图.
我想知道,最佳做法是什么.最初我在考虑这样的事情:
@Provides
ActionResolver provideActionResolver(Dependency dep1,Dependency dep2) {
Map<SomeEnum,Action> map = new HashMap<>();
map.put(SomeEnum.A1,new Action1(dep1);
map.put(SomeEnum.A2,new Action2(dep2);
return new ActionResolver(map);
}
Run Code Online (Sandbox Code Playgroud)
我想知道这是正确的方法,最好的做法是什么.
我知道有很多类似的问题,但我仍然无法找到解决问题的方法,而且在这个阶段,我没有想法.我有以下设置:
这是代码的样子:
ApplicationModule.java
@Module
public class ApplicationModule {
private Application mApp;
public ApplicationModule(Application app) {
mApp = app;
}
@Provides
@Singleton
public Application provideApplication() {
return mApp;
}
@Provides
@Singleton
Context provideApplicationContext() {
return mApp.getApplicationContext();
}
}
Run Code Online (Sandbox Code Playgroud)
ApplicationComponent.java
@Singleton
@Component(modules = {ApplicationModule.class})
public interface ApplicationComponent {
Application application();
Context getContext();
}
Run Code Online (Sandbox Code Playgroud)
NetModule.java
@Module
public class NetModule {
String mBaseUrl;
public NetModule(String baseUrl) {
this.mBaseUrl = baseUrl;
}
@Provides
@Singleton
SharedPreferences providesSharedPreferences(Application application) {
return PreferenceManager.getDefaultSharedPreferences(application);
} …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) 我正在从 Dagger 2.0.2 迁移到 Dagger 2.12 并计划使用dagger.androidAPI。
我的问题是关于迁移测试代码。目前,我有一个AppModule和一个TestAppModule,它扩展了它并使用@Override注释覆盖了一些依赖项。下面是一个例子:
@Module
public class TestAppModule extends AppModule {
@Override
public UserDao provideUserDao() {
return mock(UserDao.class);
}
}
Run Code Online (Sandbox Code Playgroud)
现在使用 Dagger 2.12,如果我尝试覆盖 中的依赖项
TestAppModule,则会引发错误:error: @Provides methods may not be overridden in modules.
使用原样定义的其余依赖项在一段TestModule时间内覆盖和模拟某些依赖项的推荐方法AppModule是什么?
如果人们认为有必要,我可以发布我的 Dagger 设置的精简版本。
我正在使用匕首 2.11
模块
@Module
class MyModule {
@Provides
fun provideString() : String = "yo"
@Provides @Named("injector")
fun provideInzectorString() : String = "named_injection"
@Singleton @Provides //The error goes away if I remove @Singleton
fun provideRepository() = Repository(Interceptor(),"")
}
Run Code Online (Sandbox Code Playgroud)
活动绑定模块
@Module
abstract class ActivityBindingModule {
@ContributesAndroidInjector(modules = [MyModule::class])
abstract fun suggestionActivity() : SuggestionsActivity
@ContributesAndroidInjector(modules = [MyModule::class])
abstract fun editSubscriptionActivity() : SubscribeActivity
}
Run Code Online (Sandbox Code Playgroud)
应用组件
@Singleton
@Component(modules = {
AndroidInjectionModule.class,
MyModule.class
})
interface AppComponent {
@Component.Builder
interface Builder {
@BindsInstance
Builder application(MyApplication application);
AppComponent …Run Code Online (Sandbox Code Playgroud)