使用Dagger 2.0

时间:2015-12-12 12:46:27

标签: java android dependency-injection dagger-2

我有多项活动扩展 BaseActivity 。每个活动都有自己的组件和模块。这些组件扩展了 BaseActivityComponent ,它具有自己的 BaseActivityModule 。 现在我有两个活动,我希望能够注入其他活动无法实现的对象。

我该怎么做?

我尝试为这两个活动创建一个基本组件和基本模块,但这给了我错误:

  

MyModule依赖于非分层次序中的作用域组件

现在我希望两个活动共享 AdvertAdvanced

此组件由以下两项活动之一使用:

@ActivityScope
@Component(
        dependencies = ApplicationComponent.class,
        modules = {
                BaseActivityModule.class,
                MainActivityModule.class
        }
)
public interface MainActivityComponent extends BaseActivityComponent {
        void inject(MainActivity mainActivity);
        MainActivityPresenter mainPresenter();
        AdvertAdvanced advertAdvanced();
}

作为每项活动的基本组成部分,我有以下内容:

    @ActivityScope
    @Component(dependencies = ApplicationComponent.class, modules = BaseActivityModule.class)
    public interface BaseActivityComponent extends ApplicationComponent {

        BaseActivity baseActivity();
        Navigator navigator();
        KeyboardAction keyboardAction();

    }

申请组件:

    @Singleton
    @Component(
            modules = {
                    ApplicationModule.class
            }
    )
    public interface ApplicationComponent {

        void inject(BaseActivity activity);

        Context context();
        ApiService apiService();
        Picasso picasso();

    }

这就是活动模块的样子:

@Module
public class MainActivityModule {

    private AdvertAdvanced advertAdvanced;

    public MainActivityModule() {
        advertAdvanced = new AdvertAdvanced();
    }

    @Provides
    @ActivityScope
    MainActivityPresenter provideActivityPresenter(****) {
        return ****;
    }

    @Provides
    @ActivityScope
    AdvertAdvanced advertAdvanced() {
        return advertAdvanced;
    }

}

1 个答案:

答案 0 :(得分:1)

您需要定义一个新组件AdvertActivityComponent,其组件依赖关系为BaseActivityComponent,并使用@AdvertisedScope等子范围。您当前的BaseActivityComponent应该有自己的范围,例如@BaseScope,而您的MainActivityComponent应该依赖于AdvertActivityComponent @ConcreteActivityScope

基本上,您的范围层次结构是:

  • 申请范围(@Singleton
  • 基本活动范围(@BaseScope
  • 广告活动范围(@AdvertScope
  • 主要活动范围(@ConcreteScope

你的组件应该相互扩展并依赖于它们的超级组件。