标签: dagger

用Dagger将依赖注入Singleton?

是否有可能让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)

java android dependency-injection dagger

3
推荐指数
1
解决办法
4628
查看次数

当你在 Dagger 中“包含”来自另一个模块的模块时会发生什么?

匕首文档页说:

要充分利用编译时验证,请创建一个包含应用程序所有模块的模块。

这留下了一些需要回答的问题:

  • 包含其他模块的实际效果是什么?(至少,似乎包含的模块不需要直接实例化)
  • 不同模块多次包含一个模块是否合法/可能?那会发生什么?

dagger

3
推荐指数
1
解决办法
565
查看次数

使用 Dagger 注入登录会话

我正在调整我的项目以使用 DI - 特别是 Dagger。我在注入类时没有问题,但是如何“注入”运行时生成的变量?

说,我想存储用户的登录会话对象,其中包含诸如api-token、之类的数据loggedUsername。当用户成功登录时,这个对象在运行时生成,在另一个负责这样做的类中。

作为一个例子,我想要的是简单地做这样的事情:

public class FooPresenter {
    ...

    Session mSession;

    @Inject FooPresenter(Session session, ...) {
        mSession = session;
        ...
    }

    ...
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

java android dependency-injection dagger

3
推荐指数
1
解决办法
1233
查看次数

如何在活动之间共享Dagger2子组件

我想知道如何在活动之间共享子组件?

假设我有一个与Application一起使用的全局AppComponent.

当用户实际登录我的应用程序时,我希望有一个UserComponent,它存在于多个活动中.

当用户登录时,我的应用程序会创建一个UserComponent,其他活动必须从某个地方检索,但我不知道什么是最好的"某处".

我应该将UserComponent存储在Application中并创建一个getter和一个重置组件的方法吗?我应该将此组件放在ApplicationModule内的"holder"对象中以​​及每个子活动中,通过从ApplicationComponent获取"holder"来检索我的组件吗?我应该将它存储在静态字段中吗?我应该做别的吗?

android dependency-injection dagger

3
推荐指数
1
解决办法
484
查看次数

Dagger不喜欢抛出异常的构造函数

我正在尝试在我的Android应用程序中使用Dagger来简化依赖注入.看起来Dagger 2.0不支持抛出异常的构造函数.这个问题有方法解决吗?

重构和创建抛出异常的init方法似乎不可行,因为必须在整个依赖对象链上调用init重新引入了匕首解决的问题.

java android dagger dagger-2

3
推荐指数
1
解决办法
2177
查看次数

如何在匕首中创建地图的值

在我的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)

我想知道这是正确的方法,最好的做法是什么.

java dagger

3
推荐指数
1
解决办法
425
查看次数

如果没有@ Provide-annotated方法,则无法提供Dagger 2

我知道有很多类似的问题,但我仍然无法找到解决问题的方法,而且在这个阶段,我没有想法.我有以下设置:

  • 应用程序模块/组件:仅用于上下文和Application对象.
  • 网络模块/组件:改造客户端
  • 城市模块/组件:在MVP屏幕中注入依赖关系的模块/组件.我想在片段中注入Presenter和Interactor.
  • PlaceRequests:改造界面

这是代码的样子:

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)

java android dependency-injection dagger dagger-2

3
推荐指数
1
解决办法
2922
查看次数

Dagger 2.11 ContributesAndroidInjector Singleton依赖注入失败

我正在从Dagger 2.11中探索新的dagger.android.我希望不必创建自定义范围注释@PerActivity.到目前为止,我能够做到以下几点:

1)定义应用程序范围单例并将它们注入活动.

2)定义活动范围非单例依赖关系,并使用它们将它们注入到它们的活动中 @ContributesAndroidInjector

我无法弄清楚的是如何使用它的应用程序范围Singleton和Activity范围非单例.

在下面的示例中,我想要我的活动范围MyActivityDependencyAMyActivityDependencyB可以访问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 dagger-2

3
推荐指数
1
解决办法
3896
查看次数

迁移到 Dagger 2.12 并测试模块覆盖

我正在从 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 设置的精简版本。

android dagger dagger-2

3
推荐指数
1
解决办法
573
查看次数

子组件(无作用域)不能引用作用域绑定:@Singleton @Provides @org.jetbrains.annotations.NotNull

我正在使用匕首 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)

singleton android dagger dagger-2

3
推荐指数
1
解决办法
2699
查看次数

标签 统计

dagger ×10

android ×7

dagger-2 ×5

java ×5

dependency-injection ×4

singleton ×1