【问题标题】:Injecting from many scopes at Dagger 2在 Dagger 2 从多个范围注入
【发布时间】:2015-07-15 09:42:29
【问题描述】:

我想从同一个类的两个作用域中注入对象。 例如。我正在实施 MVP。作为一个视图,我有一个片段。在我想注入的那些片段中:

  • ApplicationScope 的演示者(我使用 Singleton)
  • 来自 ActivityScope 的 RecyclerView.Adapter 和 LayoutManager 的衍生物。

有可能吗?实现这一目标的最佳做法是什么?

【问题讨论】:

    标签: android dependency-injection mvp dagger-2


    【解决方案1】:

    是的,这绝对是可能的。可能有不同的方法可以做到这一点。

    只要每个组件指定一个范围,这很简单。例如,如果您的应用程序级依赖项是@Singleton,那么您的活动级组件也需要@Scope,例如@ActivityScope...

    例如:应用程序/单例范围组件:

    @Singleton
    @Component
    public interface ApplicationComponent {
        MainPresenter getMainPresenter();
    }
    

    活动模块:

    @Module
    public class MainModule {
        private final Activity mActivity;
    
        public MainModule(Activity activity) {
            mActivity = activity;
        }
    
        @Provides
        Context provideContext() {
            return mActivity;
        }
    
        // and other activity-specific dependencies here...
    }
    

    和匹配的活动级组件:

    @ActivityScope
    @Component(dependencies = ApplicationComponent.class, modules = MainModule.class)
    public interface MainComponent {
        void initialize(MainActivityFragment mainActivityFragment);
    }
    

    然后一切正常...例如,您可以将单例和活动范围依赖项注入片段:

    final MainComponent mainComponent = DaggerMainComponent.builder()
            .applicationComponent(((App) getActivity().getApplication()).getComponent())
            .mainModule(new MainModule(getActivity()))
            .build();
    
    ...
    
    mainComponent.initialize(this);
    

    查看完整的工作代码here

    PS。我不太确定最好让演示者单例:-) 出于一个原因,我希望将活动级别的依赖项注入演示者,但这样就不可能了......让我知道这对您有何作用,以及您是否找到另一种留住演示者的方法。

    【讨论】:

    • ActivityScope 太小,ApplicationScope 太大 :( 我猜只有Mortar 可以用复杂的方式解决这个问题。
    猜你喜欢
    • 2016-06-28
    • 1970-01-01
    • 2016-12-01
    • 2022-09-30
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-13
    相关资源
    最近更新 更多