Dagger 2范围和多个边界

时间:2018-03-22 19:20:57

标签: android dagger-2 dagger

在Dagger 2 Android中,我真的很喜欢新的简化API,但我现在需要一点点自定义,这让我头疼。

我有一个非常常见的场景:一个带有一些活动的应用程序,并注入了每个依赖项。

我将首先描述我当前的实现,然后是问题。拜托我一秒钟,拜托。

我首先创建了常规ActivitiesModule

@Module
abstract class ActivitiesModule {
    @PerActivity
    @ContributesAndroidInjector(modules = MainActivityModule.class)
    abstract MainActivity bindMainActivity();

    // More activities here, all with the scope @PerActivity
}

然后我的MainActivityModule.java(和所有其他活动模块)看起来像这样

@Module
public abstract class MainActivityModule {
    @Binds
    @ActivityContext
    @PerActivity
    abstract Context provideActivityContext(MainActivity mainActivity);

    @Binds
    @PerActivity
    abstract Activity provideActivity(MainActivity mainActivity);

    @Binds
    @PerActivity
    abstract MainMvpView provideView(MainActivity mainActivity);
}

这很完美,因为每次我需要一个类中的活动或上下文时,我都可以这样做,而不会将我的对象与特定活动紧密耦合。

@PerActivity
public class MainPresenter {
    private final MainMvpView view;

    @Inject
    MainPresenter(MainMvpView view) {
        this.view = view;
    }
}

这很好,因为如果我不需要,我不需要声明@Subcomponent然而,现在我想在我的MainActivity子组件中注入自定义视图,并且我遇到了回到旧dagger.android方式的问题。

到目前为止,我用旧的方式替换ContributesAndroidInjector,就像这样

@Binds
@IntoMap
@ActivityKey(MainActivity.class)
abstract AndroidInjector.Factory<? extends Activity> 
bindMainActivityInjectorFactory(MainActivitySubcomponent.Builder builder);

我创建了一个新的MainActivitySubcomponent,看起来像这样

@PerActivity
@Subcomponent
public interface MainActivitySubcomponent extends AndroidInjector<MainActivity> {
    @Subcomponent.Builder
    abstract class Builder extends AndroidInjector.Builder<MainActivity> {}
}

该模块几乎保持不变。问题是我收到很多错误,表示ActivityContext被绑定多次。

所以我的两个问题是:

  1. 如果@Binds Activity Contextdagger.android,如果它们是作用域的,那么我是否可以保持完全解耦?
  2. 是否可以使用,中的最新内容进行查看注入?
  3. 任何建议都将不胜感激。

0 个答案:

没有答案